在 JavaScript 中,对象是一种非常常见的数据类型。在开发中,我们经常需要对对象进行操作,其中一个常见的操作就是复制对象。在 ES11 中,标准库中新增了浅拷贝方法,让对象的复制变得更加简单。
什么是浅拷贝
浅拷贝指的是复制一个对象,创建一个新的对象,新对象中的属性值和原对象中的属性值相同,但是新对象和原对象并不是同一个对象。浅拷贝只是复制了对象的引用,而不是对象本身。因此,如果原对象中的属性值是一个对象,那么新对象中的属性值也会是同一个对象。
下面是一个示例代码,展示了浅拷贝的实现:
const obj1 = { a: 1, b: 2, c: { d: 3 } }; const obj2 = Object.assign({}, obj1); console.log(obj1 === obj2); // false console.log(obj1.c === obj2.c); // true
在上面的代码中,我们先创建了一个对象 obj1
,该对象有三个属性:a
、b
和 c
。其中 c
属性的值是一个对象。然后,我们使用 Object.assign()
方法将 obj1
复制到了一个新的对象 obj2
中。最后,我们分别输出了 obj1
和 obj2
是否相等以及它们中的 c
属性是否相等。
由于 obj2
是通过 Object.assign()
方法复制得到的,因此 obj1
和 obj2
并不是同一个对象。因此,第一个输出结果为 false
。但是,由于 c
属性的值是一个对象,而浅拷贝只是复制了对象的引用,因此 obj1.c
和 obj2.c
实际上指向的是同一个对象。因此,第二个输出结果为 true
。
ES11 标准库中的浅拷贝方法
在 ES11 中,标准库新增了一个浅拷贝方法 Object.shallowCopy()
,用于实现对象的浅拷贝。该方法的语法如下:
Object.shallowCopy(target, ...sources);
该方法接受两个或多个参数,第一个参数 target
是目标对象,后面的参数 ...sources
是源对象,用于将源对象的属性复制到目标对象中。该方法返回目标对象。
下面是一个示例代码,展示了如何使用 Object.shallowCopy()
方法实现对象的浅拷贝:
const obj1 = { a: 1, b: 2, c: { d: 3 } }; const obj2 = Object.shallowCopy({}, obj1); console.log(obj1 === obj2); // false console.log(obj1.c === obj2.c); // true
在上面的代码中,我们先创建了一个对象 obj1
,该对象有三个属性:a
、b
和 c
。其中 c
属性的值是一个对象。然后,我们使用 Object.shallowCopy()
方法将 obj1
复制到了一个新的对象 obj2
中。最后,我们分别输出了 obj1
和 obj2
是否相等以及它们中的 c
属性是否相等。
由于 obj2
是通过 Object.shallowCopy()
方法复制得到的,因此 obj1
和 obj2
并不是同一个对象。因此,第一个输出结果为 false
。但是,由于 c
属性的值是一个对象,而浅拷贝只是复制了对象的引用,因此 obj1.c
和 obj2.c
实际上指向的是同一个对象。因此,第二个输出结果为 true
。
总结
在 JavaScript 中,对象是一种非常常见的数据类型。在开发中,我们经常需要对对象进行操作,其中一个常见的操作就是复制对象。在 ES11 中,标准库中新增了浅拷贝方法 Object.shallowCopy()
,让对象的复制变得更加简单。浅拷贝只是复制了对象的引用,而不是对象本身。因此,如果原对象中的属性值是一个对象,那么新对象中的属性值也会是同一个对象。在实际开发中,我们需要根据具体的业务场景选择合适的复制方式。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/656c405cd2f5e1655d4a4a63