我编写了以下JavaScript:
var myArray = ['a', 'b', 'c']; var copyOfMyArray = myArray; copyOfMyArray.splice(0, 1); alert(myArray); // alerts ['b','c'] alert(copyOfMyArray); // alerts ['b','c'] var myNumber = 5; var copyOfMyNumber = myNumber; copyOfMyNumber = copyOfMyNumber - 1; alert(myNumber); // alerts 5 alert(copyOfMyNumber); // alerts 4
此代码声明一个变量myArray并将其设置为数组值。然后,它声明第二个变量copyOfMyArray并将其设置为myArray。它对进行操作copyOfMyArray,然后向myArray和发出警报copyOfMyArray。不知何故,当我对执行操作时copyOfMyArray,似乎对执行了相同的操作myArray。
myArray
copyOfMyArray
然后,代码对数字值执行相同的操作:声明一个变量myNumber并将其设置为数字值。然后,它声明第二个变量copyOfMyNumber并将其设置为myNumber。它对进行操作copyOfMyNumber,然后向myNumber和发出警报copyOfMyNumber。在这里,我得到预期的行为:对不同的价值观myNumber和copyOfMyNumber。
myNumber
copyOfMyNumber
数组与JavaScript中的数字有什么区别,似乎更改数组会更改该数组副本的值,而更改数字不会更改该数字副本的值吗?
我猜测由于某种原因,数组是通过引用引用的,而数字是通过值引用的,但是为什么呢?我如何知道其他对象会有什么行为?
JavaScript中的数组也是一个 对象 ,变量仅包含 对 对象的 引用 ,而不是对象本身。因此,两个变量都引用 同一 对象。
您与数字示例的比较是不正确的。您将新值分配给copyOfMyNumber。如果您为其分配新值,copyOfMyArray则也不会更改myArray。
您可以使用slicedocs创建数组的副本:
slice
var copyOfMyArray = myArray.slice(0);
但是请注意,这只会返回浅表副本,即不会克隆数组中的对象。