基本数据类型(值类型)
-
number
包括两种特殊的:
非有效数字 NaN,而且 NaN===NaN结果为false
无穷大Infinity,Infinity===Infinity结果为true
-
string
-
boolean
-
null
-
undefined
-
symbol(唯一值)
如何使用,以及注意事项
console.log(Symbol()) // 唯一值 console.log(Symbol()===Symbol()) //false let symb = Symbol() console.log(symb===symb) // true console.log(new Symbol()) // 不可以这样写 Uncaught TypeError: Symbol is not a constructor项目中的应用
-
给对象设置唯一的属性
-
在vuex/redux中做行为派发的时候,统一管理派发的行为标识,标识的值可以是唯一值
-
很多其他的原理 都是基于Symbol的方法的
例如Symbol.toPrimitive方法(原始值):把一个对象数据类型的值,转换为数字/字符串
- 首先查找对象的Symbol.toPrimitive属性 (如果有按照这个属性处理)
- 如果不存在这个属性,紧接着调用对象的valueOf方法获取原始值(原始值指的是基本类型值)
- 如果获取不到原始值(不是基本数据类型的值),则再调用toString&Number转换成字符串或者数字
-
-
binint(超大数字)
大数字运算的时候 会出错,可以直接加个n
Number.MAX_SAFE_INTEGER 可以获得最大安全数,超过这个数的计算就不准确,运算的时候可以直接加n转换为binint类型。
900719925474099199n 900719925474099199n+1n
引用数据类型
-
对象类型 object
普通对象、数组对象、正则、日期、JSON、Set、Map
-
函数类型 function(其实函数类型也是对象,只是有区别,暂时这么细分)
普通函数、构造函数、箭头函数、生成器函数
检测数据类型
-
typeof
typeof不能细分对象,不能区分null和object。原理:所有数据类型值在计算机存储都是按照“二进制”存储的,typeof检测的时候,是按照计算机存储二进制的值来检测的。
只要是对象都是以 000 开始的,而null -> 000000,所以typeof null => 'object'。
函数 function不是以000开始的,所以typeof function(){} => 'function'。
typeof NaN => 'number' typeof null=> 'object' typeof {} => 'object' -
instanceof
-
Object.prototype.toString.call
-
constructor
检测类型具体详情可以参考JS中四种数据类型检测底层机制
知识点
-
检测是否为有效数字 用isNaN(变量)
-
Object.is(value1,value1) 方法判断两个值是否为同一个值,返回布尔类型值。
与== 运算不同。 == 运算符在判断相等前对两边的变量(如果它们不是同一类型) 进行强制转换 (这种行为的结果会将 "" == false 判断为 true), 而 Object.is不会强制转换两边的值。
与=== 运算也不相同。 === 运算符 (也包括 == 运算符) 将数字 -0 和 +0 视为相等 ,而将Number.NaN 与NaN视为不相等
Object.is(NaN,NaN) true