JavaScript❤️‍🔥手记1️⃣

83 阅读2分钟

typeofinstanceof检测数据类型异同

typeof 返回一个字符串表示运算数的数据类型。
返回值包括: 'undefined', 'boolean', 'number', 'string', 'symbol', 'bigint', 'object', 'function'

typeof valresult
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) 来返回运算数的具体类型,将引用类型细化

延申链接

手写-instanceOf
手写-typeOf
Object.prototype.toString.call应用

数据的存储形式-堆栈

栈: 为原始类型开辟的内存空间, 如: number string ...
堆: 为引用类型开辟的内存空间, 如: 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)

感谢阅读,敬请斧正!