在 JavaScript 中,我们通常会遇到需要引用和复制对象的情况。正确的引用和复制可以帮助我们更好地处理数据,提高代码效率。
引用
在 JavaScript 中,当我们将一个对象赋值给另一个变量时,实际上是将对象的引用赋给了该变量,而不是复制对象本身。
let obj1 = { name: 'Tom' }; let obj2 = obj1; obj2.name = 'Jerry'; console.log(obj1.name); // Jerry
在上面的代码中,我们将 obj1
的引用赋值给了 obj2
,所以当我们修改 obj2
的属性时,obj1
的属性也会被修改。
为了避免这种情况,在某些情况下我们可以使用 Object.assign()
方法,将一个对象的属性复制到另一个对象中。
let obj1 = { name: 'Tom' }; let obj2 = Object.assign({}, obj1); obj2.name = 'Jerry'; console.log(obj1.name); // Tom
上面的代码中,我们创建了一个新的空对象,使用 Object.assign()
将 obj1
的属性复制到了它中,并将新对象的引用赋值给了 obj2
。这样,当我们修改 obj2
的属性时,并不会影响 obj1
。
复制
在 JavaScript 中,常用的对象复制方式有浅复制和深复制。
浅复制
浅复制是复制对象的第一层属性,如果对象中还有嵌套的对象,浅复制只是复制它们的引用而已。
let obj1 = { name: 'Tom', age: 20, hobby: { type: 'Sports', name: 'Football' } }; let obj2 = Object.assign({}, obj1); obj2.hobby.name = 'Basketball'; console.log(obj1.hobby.name); // Basketball
在上面的代码中,我们使用 Object.assign()
对 obj1
进行了浅复制,但是由于 obj1
的 hobby
属性是一个对象,Object.assign()
只是复制了它的引用而已。所以当我们修改 obj2
的 hobby.name
属性时,obj1
的属性也被修改了。
深复制
深复制是复制对象的所有属性,包括嵌套的对象。
let obj1 = { name: 'Tom', age: 20, hobby: { type: 'Sports', name: 'Football' } }; let obj2 = JSON.parse(JSON.stringify(obj1)); obj2.hobby.name = 'Basketball'; console.log(obj1.hobby.name); // Football
在上面的代码中,我们使用了 JSON.stringify()
和 JSON.parse()
来对 obj1
进行深复制。这样,当我们修改 obj2
的 hobby.name
属性时,并不会影响 obj1
。
需要注意的是,在使用 JSON.stringify()
和 JSON.parse()
时,要注意对象中是否存在循环引用的情况,否则会出现无限递归的问题。
总结
在 JavaScript 中,正确的引用和复制可以帮助我们更好地处理数据。浅复制只是复制对象的第一层属性,而深复制则复制对象的所有属性,包括嵌套的对象。当我们需要对对象进行复制时,需要根据实际情况选择合适的复制方式。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64632d06968c7c53b04307be