数据类型的分类
原始值类型
- number
- string
- boolean
- null
- undefined
- symbol
- bigint
对象类型
- 标准基础对象
- 标准特殊对象 如:
+ new Array 数组
+ new RegExp 正则
+ new Date 日期对象
+ new Error 错误对象
+ Set/Map - 非标准特殊对象 如:
- new Number()
- 函数对象
symbol的作用
symbol用法:Symonl(‘描述’)
每个symbol调用的时候都会创建一个新的唯一值symbol,这里的描述只是为了我们自己方便区分辨识symbol,对symbol本身的值并没有任何影响
symbol的作用
- 创建一个和其他值不相等的值
- 可以给对象设置一个symbol类型的成员,
var ary = [10,20] var sym = Symbol('sym') var obj ={ [ary] : 'aryValue', [sym] :'symValue' }
给对象添加symbol成员可以事先将一个symbol赋值给一个变量,然后[]包裹着变量给对象添加成员
- 处理一些js底层机制
对象的枚举
-
Object.keys()
返回一个对象的自身可枚举属性组成的数组 -
Object.getOwnPropertyNames()
返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括 Symbol 值作为名称的属性)组成的数组。 -
Object.getOwnPropertySymbols()
返回一个给定对象自身的所有 Symbol 属性的数组。 -
Reflect.ownKeys
返回一个由目标对象自身的属性键组成的数组。
let keys = Object.getOwnPropertyNames(obj);
keys = keys.concat(Object.getOwnPropertySymbols(obj));
let keys = Reflect.ownKeys(obj); //这一个操作,代替了上面两个操作「ES6新提供的方法」
数据类型检测的办法
- typeof
- instanceof
- constructor
- Object.prototype.toString.call
typeof的底层原理
- typeof 首先会获取值,如果变量没有声明,并不会报错,而是会返回’undefined’
- 查看这个值在计算机内存里面存储的二进制的数据,将二进制数据的最前面三个字符进行比对
+ 000 对象
+ 1 整数
+ 010 浮点数
+ 100 字符串
+ 110 布尔
+ 000000… null
+ -2^30 undefined - 当检测出来是对象的时候,会去看是否实现了call方法,如果实现了就说明数据是一个函数对象,返回’function’,否则就是’object’
因为null在计算机存储的二进制为64个0,所以typeof会把null当做对象识别,所以会返回object
typeof的应用
- 检测除null以外的原始值数据类型(基于底层二进制进行判断,性能高)
- 笼统检测数据是否为对象
- 检测数据是否为函数
- 处理浏览器兼容 「ES6+语法规范,都不兼容IE」 如:
if (typeof Symbol !== 'undefined') { 当前浏览器支持Symbol} ...