对象的深拷贝和浅拷贝

对象类型在赋值的过程其实是复制了地址,从而会导致改变了一方另一方也会改变。如下例子:

let a = {
  age: 1
}
let b = a
a.age = 2
console.log(b.age) // 2

然而在开发中我们一般不希望出现这样的问题,于是就有了浅拷贝方法。

首先可以通过 Object.assign 来解决这个问题,Object.assign将所有的属性,属性值拷贝到新对象里,但如果属性值也是对象的话,拷贝的是地址,所以不是深拷贝。

let a = {
  age: 1
}
let b = Object.assign({}, a)
a.age = 2
console.log(b.age) // 1

对于浅拷贝出现的问题,我们可以通过深拷贝JSON.parse(JSON.stringify(obj))解决。例如:

let a = {
  age: 1,
  jobs: {
    first: 'FE'
  }
}
let b = JSON.parse(JSON.stringify(a))
a.jobs.first = 'native'
console.log(b.jobs.first) // FE

但是该方法也是有局限性的:

  • 会忽略 undefined
  • 会忽略 symbol
  • 不能序列化函数
  • 不能解决循环引用的对象

let a = {
  age: undefined,
  sex: Symbol('male'),
  jobs: function() {},
  name: 'yck'
}
let b = JSON.parse(JSON.stringify(a))
console.log(b) // {name: "yck"}

但对于大部分情况来说,这种方式能适用。还有种lodash的深拷贝方法,这里就不介绍太多了。

var objects = [{ 'a': 1 }, { 'b': 2 }];
 
var deep = _.cloneDeep(objects);
console.log(deep[0] === objects[0]);
// => false

 

posted @ 2020-03-13 13:28  Lorasysu  阅读(145)  评论(0)    收藏  举报