typeof与instanceof检测数据类型异同
typeof返回一个字符串表示运算数的数据类型。
返回值包括:'undefined','boolean','number','string','symbol','bigint','object','function'
typeof val | result |
|---|---|
Undefined | 'undefined' |
Null | 'object' |
Boolean | 'boolean' |
Number | 'number' |
String | 'string' |
Symbol | 'symbol' |
Bigint | 'bigint' |
Object(does not implements[[Call]]) | 'object' |
Object(implements[[Call]]) | 'function' |
Q: 为什么数据类型
Null返回的是'object'?
typeof检测是根据运算数的机器码后三位数做判断
对于引用类型(复杂类型)机器码后三位都是000返回'object'
而Null在 js 语言中是以全位数为0机器码存储, 后三位是000所以返回'object'
Q: 为什么数据类型不包含 function 类型,但返回值却有呢?
typeof检测引用类型时,会进一步判断当前引用类型是否有内部的[[call]]方法
如果有[[call]]方法返回'function',反之亦然!
ECMAScript® 2023 Language Specification (tc39.es)
instanceof返回一个布尔类型
检测格式:A instanceof B, 判断 A 是否是 B 的实例化对象
检测方式: 根据原型及原型链来做判断的
Object.prototype.toString.call(params)来返回运算数的具体类型,将引用类型细化
延申链接
数据的存储形式-堆栈
栈: 为原始类型开辟的内存空间, 如:
numberstring...
堆: 为引用类型开辟的内存空间, 如:object
栈存储原始类型的值类型,以及堆的地址值
深浅拷贝的方式
如果B复制A, 再修改A时, 看B是否跟着发生变化
B跟着变了(A B之间是否互相影响), 说明是浅拷贝,反之亦然
浅拷贝
遍历赋值:for...in
Object.create(): 复制关系是将A赋值到B的__proto__原型上
深拷贝
JSON.stringify()&JSON.parse():B = JSON.parse(JSON.stringify(A))
deepClone
后记
个人博客 | Botaoxy (chengbotao.github.io)
chengbotao (Chengbotao) (github.com)
感谢阅读,敬请斧正!