一尘不染

为什么在JavaScript中更改数组会影响数组的副本?

javascript

我编写了以下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

然后,代码对数字值执行相同的操作:声明一个变量myNumber并将其设置为数字值。然后,它声明第二个变量copyOfMyNumber并将其设置为myNumber。它对进行操作copyOfMyNumber,然后向myNumber和发出警报copyOfMyNumber。在这里,我得到预期的行为:对不同的价值观myNumbercopyOfMyNumber

数组与JavaScript中的数字有什么区别,似乎更改数组会更改该数组副本的值,而更改数字不会更改该数字副本的值吗?

我猜测由于某种原因,数组是通过引用引用的,而数字是通过值引用的,但是为什么呢?我如何知道其他对象会有什么行为?


阅读 309

收藏
2020-04-25

共1个答案

一尘不染

JavaScript中的数组也是一个 对象 ,变量仅包含 对象的 引用 ,而不是对象本身。因此,两个变量都引用 同一 对象。

您与数字示例的比较是不正确的。您将新值分配给copyOfMyNumber。如果您为其分配新值,copyOfMyArray则也不会更改myArray

您可以使用slicedocs创建数组的副本:

var copyOfMyArray = myArray.slice(0);

但是请注意,这只会返回浅表副本,即不会克隆数组中的对象。

2020-04-25