返回

解剖对象的扩展与深浅层拷贝

前端

对象是 JavaScript 语言中用于存储和组织相关数据的基本构建块,而扩展和拷贝是两种修改和复制对象的不同方法。了解这两种方法的区别对于创建健壮且高效的 JavaScript 应用程序至关重要。

1. 对象的扩展

扩展是指向现有对象添加新属性或修改现有属性的值。可以使用点运算符 (.) 或方括号运算符 ([]) 来实现扩展。例如:

const person = {
  name: 'John',
  age: 30,
  city: 'New York'
};

// 使用点运算符扩展对象
person.job = 'Software Engineer';

// 使用方括号运算符扩展对象
person['email'] = 'john@example.com';

console.log(person);

输出:

{
  name: 'John',
  age: 30,
  city: 'New York',
  job: 'Software Engineer',
  email: 'john@example.com'
}

2. 对象的拷贝

拷贝是指创建一个新对象,其属性和值与现有对象相同。可以使用三种主要方法来实现拷贝:

  • 浅层拷贝: 创建一个新对象,其属性和值与现有对象相同,但新对象和现有对象指向相同的底层对象。
  • 深层拷贝: 创建一个新对象,其属性和值与现有对象相同,但新对象和现有对象指向不同的底层对象。
  • 展开运算符(...): ES6 引入的展开运算符,可以用来创建浅层拷贝。

2.1 浅层拷贝

浅层拷贝只拷贝对象本身的属性,而不拷贝对象引用的其他对象。使用 Object.assign() 方法或展开运算符 (...) 可以实现浅层拷贝。例如:

// 使用 Object.assign() 实现浅层拷贝
const personCopy1 = Object.assign({}, person);

// 使用展开运算符实现浅层拷贝
const personCopy2 = {...person};

console.log(personCopy1);
console.log(personCopy2);

输出:

{
  name: 'John',
  age: 30,
  city: 'New York',
  job: 'Software Engineer',
  email: 'john@example.com'
}
{
  name: 'John',
  age: 30,
  city: 'New York',
  job: 'Software Engineer',
  email: 'john@example.com'
}

2.2 深层拷贝

深层拷贝不仅拷贝对象本身的属性,还拷贝对象引用的其他对象。可以使用 JSON.parse(JSON.stringify()) 方法或第三方库(如 lodash 的 cloneDeep())来实现深层拷贝。例如:

// 使用 JSON.parse(JSON.stringify()) 实现深层拷贝
const personCopy3 = JSON.parse(JSON.stringify(person));

console.log(personCopy3);

输出:

{
  name: 'John',
  age: 30,
  city: 'New York',
  job: 'Software Engineer',
  email: 'john@example.com'
}

3. 何时使用扩展和拷贝

  • 扩展: 当需要向现有对象添加新属性或修改现有属性的值时,可以使用扩展。
  • 浅层拷贝: 当需要创建一个与现有对象具有相同属性和值的新对象时,可以使用浅层拷贝。
  • 深层拷贝: 当需要创建一个与现有对象具有相同属性和值的新对象,并且该新对象不与现有对象共享相同的底层对象时,可以使用深层拷贝。

4. 总结

对象扩展和拷贝是修改和复制对象的不同方法。了解这两种方法的区别对于创建健壮且高效的 JavaScript 应用程序至关重要。