返回

浅拷贝与深拷贝:理解JavaScript中对象的复制行为

前端

浅尝辄止的浅拷贝

浅拷贝,顾名思义,就是仅复制对象的第一层属性值,而不会复制嵌套的对象。当您使用赋值运算符(=)或Object.assign()方法时,默认情况下都会进行浅拷贝。

举个例子,假设我们有一个对象obj1:

const obj1 = {
  name: 'John Doe',
  age: 30,
  info: {
    city: 'New York',
    state: 'NY'
  }
};

现在,我们使用Object.assign()方法创建一个新的对象obj2,并将obj1作为参数传递:

const obj2 = Object.assign({}, obj1);

在这个过程中,obj2只复制了obj1的第一层属性值,包括name和age。而info属性则只是复制了指向obj1中info对象的指针,而不是复制info对象本身。

现在,如果我们修改obj2中的info对象:

obj2.info.city = 'Los Angeles';

令人惊讶的是,obj1中的info对象也会被修改,因为obj2和obj1都指向同一个info对象。

深挖内涵的深拷贝

深拷贝,与浅拷贝相反,会复制对象的所有层级属性,包括嵌套的对象。这意味着,即使您修改了深拷贝后的对象,也不会影响原始对象。

在JavaScript中,实现深拷贝的方法有很多种,其中一种最常用的方法是使用JSON.parse()和JSON.stringify()方法。

const obj1 = {
  name: 'John Doe',
  age: 30,
  info: {
    city: 'New York',
    state: 'NY'
  }
};

const obj2 = JSON.parse(JSON.stringify(obj1));

在这个过程中,JSON.stringify()方法将obj1对象转换为JSON字符串,然后JSON.parse()方法将JSON字符串解析为新的对象obj2。

现在,如果我们修改obj2中的info对象:

obj2.info.city = 'Los Angeles';

obj1中的info对象不会受到影响,因为obj2和obj1是两个完全独立的对象。

结语

浅拷贝和深拷贝是JavaScript中两种常用的对象复制方式。理解这两种方式的区别对于操作对象至关重要。浅拷贝仅复制对象的第一层属性值,而深拷贝则复制对象的所有层级属性。选择哪种复制方式取决于您的具体需求。