JS深拷贝
浅拷贝
创建了一个新的对象,这个对象有着原始对象属性值得精确拷贝,如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。
1 | Object.assign(target, ...sources) |
判断类型的方式
typeof
typeof可以用于判断以下js的8种类型:
js的8中数据类型:
- Boolean
- Null
- Undefined
- Number
- BigInt – 浏览器已经支持了
- String
- Symbol
- Object
但也有缺点 — 暂时性死区(TDZ)
我们知道let和const 具有暂时性死区(即在代码块内,使用let/const命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”)
typeof也具有暂时性死区
1 | typeof x; // ReferenceError -- 声明在后导致出错 |
1 | typeof undeclared_variable // "undefined" -- 若一个变量根本没有声明,倒不会报错 |
1 | // 考烂了的面试题 |
instanceof
原理: 右边变量的prototype在左边变量的原型链上即可(右边构造函数的原型在不在左边实例的原型链上)
1 | String instanceof String // false |
Object.prototype.toString()
深拷贝
将一个对象从内存中完整的拷贝出来一份,从内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象
最常用的一种方式 – 业务中用(不适合于面试)
1 | let d = JSON.parse(JSON.stringify(x)) // 将x深拷贝给d |
基本版本
1 | function deepCopy( obj ){ |
面试版本
1 | // 面试版本 |
1 | // 测试用例 |
学习自京程一灯董老师课程,如有侵权,联系删除
本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Charles's Blog!