通过JSON.parse(JSON.stringify(object))来实现深拷贝是存在局限性的

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属性。

这就是该方法的局限之处。