js对象怎么实现深拷贝?
我们可以使用JSON.parse(JSON.stringify(object))
来实现,而且这种方式基本能解决大部分情况。
let a = { name: 'Andy', hobbies: { first: '篮球' } } let b = JSON.parse(JSON.stringify(a)) a.hobbies.first = '足球' console.log(b.hobbies.first) // 篮球
但是,该方法是存在「局限性」的。
let obj = { a: 1, b: { c: 2, d: 3, }, } obj.c = obj.b obj.e = obj.a obj.b.c = obj.c obj.b.d = obj.b obj.b.e = obj.b.c let newObj = JSON.parse(JSON.stringify(obj)) console.log(newObj)
如果对象中存在「循环引用」,程序会报错:
而且,如果遇到不支持的数据类型,比如函数、undefined、或symbol的时候,这些属性都会被忽略:
let a = { age: undefined, sex: Symbol('male'), hobbies: function(){}, name: 'Andy' } let b = JSON.parse(JSON.stringify(a)) console.log(b) // {name:"Andy"}
从以上代码可以发现,JSON.stringify(a)只保留了name
属性。
这就是该方法的局限之处。