js的8种数据类型

JavaScript中有8种数据类型, 包括基本数据类型(number, string, boolean, null, undefined, symbol, bigint)和引用数据类型object

number

JavaScript中的整数和浮点数都会按照浮点数的标准进行存储.

即64个二进制位, 从最左边开始:
第1位: 符号位, 0表示正数, 1表示负数
第2到第12位: 存储指数部分
第13到第64位: 存储小数部分

其中, 符号位决定一个数是正数还是负数, 指数部分决定了一个数的大小, 小数部分决定了一个数的精度

数值精度

JavaScript提供的有效数字最长为53个二进制位, 这意味着绝对值小于2的53次方的整数都能够精确表示

JavaScript内部实际的表现形式:
(-1)^符号位 * 1.xxx...xxx * 2^指数 Math.pow(2, 53) === Math.pow(2, 53) + 1

0.1 + 0.2 = 0.30000000000000004就是因为精度缺失的原因, 还有人因此做了一个网站: (http://0.30000000000000004.com/)

Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER分别表示js的最大安全数和最小安全数

数值范围

指数部分的最大值是2047(2^11 - 1), 分出一半表示负数, 那么JavaScript能够表示的数值范围为21024到2(-1023)

Number.MAX_VALUE和Number.MIN_VALUE代表js可表示的最大数字和最小数字

当一个浮点值大于(小于)js所能表示的最大(最小)值时, 其结果是Infinity(-Infinity), 12/0返回Infinity, -12/0返回-Infinity

NaN

NaN表示not a number(非数字), NaN和任何值都不相等, 包括它自己. 所以x != x当且仅当x是NaN时成立. 0/0会返回NaN

  • Number.isNaN(Number.NaN)
  • x != x 可以用来检测x是否是NaN
  • Number.isFinite()可以用来检测Number.NaN和Infinity.

bigint

bigint可以使用任意精度表示整数. 即使超出js的安全数, 也可以安全地存储和使用大整数

bigint不能表示小数

BigInt(123)

string

js中的字符串是不可变的, str.length可表示字符串的长度

基本数据类型字符串它不是对象, 却能够使用对象才有的属性和方法进行操作(比如str.length, str.split('-')), 这是因为三个关键的基本数据类型都有自己对应的对象(Number, String和Boolean). 这三个对象是针对数字, 字符串和布尔值的包装.

当我们在对象环境中使用字符串时(比如使用str.length), JavaScript会为这个字符串内部地创建一个String对象, 这个对象就代替了原始的字符串值来执行相应的操作. 注意此时被创建的String对象只是瞬时存在的, 使用之后系统就会自动将其丢弃.

boolean

null, undefined, 0, -0, NaN, ''都可以转成false

null和undefined

null == undefined会返回true, null === undefined会返回false

symbol

symbol代表独一无二的值

let s = Symbol(); // 这样就生成了一个唯一不可变的值
let s1 = Symbol('s1'); // 参数表示对symbol值的描述
let s2 = Symbol('s1'); // s1 == s2会返回false let a1 = Symbol.for('aa');
let a2 = Symbol.for('aa'); // a1 === a2会返回true
  • 用symbol作为对象的属性名时, 不能通过点去访问属性, 通过点访问, js会将属性名解析成字符串
  • JSON中无法存储Symbol类型的值
  • 不可枚举: 当Symbol值作为对象属性名时, 可以保证对象不会出现重复的属性, for in等方式无法枚举Symbol值出来, 可以调用Object.getOwnPropertySymbols()获取Symbol值. 借助Symbol的不可枚举特性可以在js中模拟私有变量

object

对象是通过调用特殊的构造函数创建的, 常常要使用到的对象有以下:

  • function: JavaScript的函数是具有可执行代码的对象, 可以通过调用函数执行某些操作
  • array
  • class
  • Date日期
  • RegExp正则表达式
    • 匹配所有中文字符, 匹配邮箱
  • Math数学
    • Math.ceil(), Math.floor()
    • Math.round(), Math.random()
  • JSON
    • null, NaN, Infinity, -Infinity, 正则对象和undefined都会被转成null
    • JSON.parse(JSON.stringify())
  • Error: 程序中发生的语法错误和运行时错误的对象

数据类型判断

typeof

  • 对于非object的基本类型, 除null以外, 均可返回意料之中的结果
  • 对于引用类型, 除function以外, 一律返回object
  • 对于null, 返回object
  • 对于function, 返回function
  • typeof(typeof a)返回的是string

因为typeof NaN会返回number, 但是NaN不能用于数值计算, 所以在使用typeof判断数字时, 建议这样子做: typeof num == 'number' && Number.isFinite(num)

instanceof

A instanceof B是用来判断B的原型是否在A的原型链上

instanceof的问题在于它假定只有一个全局执行环境, 如果存在两个及以上的全局执行环境, 那么就存在不同的构造函数, 此时instanceof无法进行判断

Object.prototype.toString.call

Object.prototype.toString.call(true) === '[object Boolean]'

constructor

当声明定义一个构造函数时, js会为构造函数添加一个prototype属性指向构造函数的原型对象, 这个原型对象会有一个constructor属性指向构造函数. 而当使用new和构造函数创建一个实例对象时, 实例对象会继承原型对象的constructor属性

let a = [], b = 100;
a.constructor == Array
b.constructor == Number

当程序员重写prototype指向之后, 原来的constructor就会丢失

使用JavaScript写一个判断数据类型的函数

function getType(data) {
if(data === null) return 'Type: null';
else if(data === undefined) return 'Type: undefined';
else if(typeof data == 'number' && Number.isFinite(data)) return 'Type: number';
else if(typeof data == 'string') return 'Type: string';
else if(typeof data == 'boolean') return 'Type: boolean';
else if(typeof data == 'function') return 'Type: function';
else {
let tmp = Object.prototype.toString.call(data);
return 'Type:' + tmp.slice(7, tmp.length-1).toLowerCase();
}
}

请你讲一讲JavaScript有哪些数据类型, 数据类型判断有哪些方法?的更多相关文章

  1. javascript最全最好的判断数组的方法

    var arr = [1,2,3,1]; var arr2 = [{ abac : 1, abc : 2 }]; function isArrayFn(value){ if (typeof Array ...

  2. 经典面试题|讲一讲JVM的组成

    JVM(Java 虚拟机)算是面试必问的问题的了,而但凡问 JVM 一定会问的第一个问题就是:讲一讲 JVM 的组成?那本文就注重讲一下 JVM 的组成. 首先来说 JVM 的组成分为,整体组成部分和 ...

  3. JAVA经典面试题:讲一讲JVM的组成

    JVM(Java 虚拟机)算是面试必问的问题的了,而但凡问 JVM 一定会问的第一个问题就是:讲一讲 JVM 的组成?那本文就注重讲一下 JVM 的组成. 首先来说 JVM 的组成分为,整体组成部分和 ...

  4. 面试必杀技,讲一讲Spring中的循环依赖

    本系列文章: 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译 读源码,我们可以从第一行读起 你知道Spring是怎么解析配置类的吗? 配置类为什么要添加@Configu ...

  5. 关于RNA-Seq数据去接头(Adapter)这事需要讲一讲

    关于RNA-Seq数据去接头(Adapter)这事需要讲一讲 RNA-Seq adapter barcode cutadapt 首先来了解一下三个概念: 1.adapter是一段短的序列已知的核酸链, ...

  6. 请写出一段JavaScript代码,要求页面有一个按钮,点击按钮弹出确认框。程序可以判断出用

    请写出一段JavaScript代码,要求页面有一个按钮,点击按钮弹出确认框.程序可以判断出用 户点击的是“确认”还是“取消”. 解答: <HTML> <HEAD> <TI ...

  7. 关于Android模块化我有一些话不知当讲不当讲

    关于Android模块化我有一些话不知当讲不当讲 最近公司一个项目使用了模块化设计,本人参与其中的一个小模块开发,但是整体的设计并不是我架构设计的,开发半年有余,在此记录下来我的想法. 关于Andro ...

  8. 极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间

    极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间 笔记体会: 方案一,事务相 ...

  9. Mysql实战45讲 05讲深入浅出索引(下)极客时间 读书笔记

    极客时间 Mysql实战45讲 04讲深入浅出索引(下)极客时间 笔记体会: 回表:回到主键索引树搜索的过程,称为回表覆盖索引:某索引已经覆盖了查询需求,称为覆盖索引,例如:select ID fro ...

随机推荐

  1. UWP 和 WPF 对比

    原文:UWP 和 WPF 对比 本文告诉大家 UWP 和 WPF 的不同. 如果在遇到技术选择或者想和小伙伴吹的时候可以让他以为自己很厉害,那么请继续看. 如果在看这文章还不知道什么是 UWP 和 W ...

  2. spring4+springmvc+hibernate4 demo

    来自 CSDN . 其实下面的更好:加入了maven集成.Spring4 MVC Hibernate4集成 下面也是一篇讲的很详细的文章: hibernate4无法保存数据 而自己遇到的hiberna ...

  3. Java实现查找二叉树&C++的做法

    写了个Java的查找二叉树,用递归做的,不用递归的还没弄出来.先贴一下.回头再研究. BTreeTest.java: public class BTreeTest{ class Node{ Node ...

  4. uva 11892 - ENimEN(推理)

    题目链接:uva 11892 - ENimEN 题目大意:给定n堆石子的个数,两人轮流选择石子堆取石子,直到不能取为失败,附加条件,假设前一次操作,即队手的操作,没有将选中石子堆中的石子取完,那么当前 ...

  5. 简明Python3教程 17.更多

    简介 迄今为止我们已经学习了python中的大多数常用知识.本章中我们会接触到更多的知识,使得我们更全面的掌握python. 传递元组 你是否希望过从函数返回两个不同的值?做到这点使用元组即可. &g ...

  6. objective-c启用ARC时的内存管理

    PDF版下载:http://download.csdn.net/detail/cuibo1123/7443125      在objective-c中,内存的引用计数一直是一个让人比較头疼的问题.尤其 ...

  7. 信小程序支付(C#后台+前台)

    今天为大家带来比较简单的支付后台处理 首先下载官方的c#模板(WxPayAPI),将模板(WxPayAPI)添加到服务器上,然后在WxPayAPI项目目录中添加两个“一般处理程序” (改名为GetOp ...

  8. UWP 应用中的Back button(TitleBar) 的处理

    后退按钮是一项系统提供的 UI 提示,可以在后退堆栈或用户导航历史记录中支持向后导航. 用起来其实也是很简单的,只需要在App.xaml.cs 中修改(添加)如下红色代码,便可实现.. sealed ...

  9. WPF编游戏系列 之八 银行界面及金额校验

    原文:WPF编游戏系列 之八 银行界面及金额校验        在前面<WPF编游戏系列 之四 用户控件>一文中通过用户控件创建了"My Shop"中物品列表框.本篇继 ...

  10. XF 键盘类型设置

    键盘类型: default Chat-输入短信或表情 Email Numeric Telephone Url-输入网址和文件路径 其他额外选项: CapitalizeSentence SpellChe ...