跟字符串类型、数值类型等这类简单类型不一样,JavaScript 的对象是引用数据类型。比如,在 key-value 型对象中:
const obj1 = { name: "JavaScript", }; const obj2 = obj1; obj2.name = "programming"; console.log(obj1.name); // programming
"obj1" 和 "obj2" 持有相同的引用,都指向该对象在内存中的存储位置。
在数组中:
const arr1 = [2, 3, 4]; const arr2 = arr1; arr2[0] = "javascript"; console.log(arr1); // ['javascript', 3, 4]
开发者常犯的一个错误是他们会忽略 JavaScript 的本质,然后就会导致一些意想不到的错误。比如,如果五个对象持有同一个对象的引用,那么某个对象就可能会在大范围的代码库里干扰到一些属性。
当这种情况发生的时候,任何试图去访问原始属性的操作都会返回 undefined 或者可能会抛出异常。
最好的实践是,当你想要复制对象的时候,永远给新的对象创建新的引用。剩余操作符("..." ES6中引入)可以很好地做到这一点。
比如,在 key-value 型对象中:
const obj1 = { name: "JavaScript", }; const obj2 = { ...obj1 }; console.log(obj2); // {name: 'JavaScript' } obj2.name = "programming"; console.log(obj.name); // 'JavaScript'
在数组中:
const arr1 = [2, 3, 4]; const arr2 = [...arr1]; console.log(arr2); // [2,3,4] arr2[0] = "javascript"; console.log(arr1); // [2, 3, 4]