当前位置: 首页 > 面试题库 >

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

楚彦
2023-03-14
问题内容

我编写了以下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中的数字有什么区别,似乎更改数组会更改该数组副本的值,而更改数字不会更改该数字副本的值吗?

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


问题答案:

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

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

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

var copyOfMyArray = myArray.slice(0);

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



 类似资料:
  • 考虑: 为什么改变的值会改变的值?

  • 问题内容: 我在变量范围方面遇到麻烦。 我期望输出到,但结果是。为什么我在方法中更改了数组中的值,但是原来的数组却更改了? 问题答案: Java中的数组是一个对象。当您通过创建数组时,它是在堆上创建的,并且返回一个参考值(类似于C中的指针)并将其分配给您的变量。 在C语言中,这表示为: 当您将该变量传递给方法时,您将传递给该方法中的局部(堆栈)变量分配(复制)的参考值。不会复制数组的内容,仅复制参

  • 我在使用Ruby数组时遇到了一些意外的行为: 终端输出: 第一个问题:为什么array1和array2中的项目不同,尽管只在array3上迭代?连接两个数组会返回一个新数组,那么为什么array1和array2会有延迟效应呢? 第二个问题:如何通过迭代来更改array3中的项目,而不更改项目array1或array2? 第三个问题:当使用. map和. each代替. map!时,输出是相同的。所

  • 我正在尝试这样的事情: 父组件 编辑用户体验。vue 当我尝试更改中的数据时,它会自动更改中的数据。 有什么意义?

  • 问题内容: 我对map()的行为感到困惑。 我有一个这样的对象数组: 我将此数组传递给应该返回相同数组但所有产品均免费的函数: 函数是: 它返回以下数组: 所以我重写了我的职能是: 它将按预期返回数组。 但是!在那一刻,我放松了主意,在这两种情况下,我都修改了原始产品阵列。 有关map()的文档说不应这样做(https://developer.mozilla.org/en- US/docs/Web

  • 我有一个包含复杂条目的数组列表的结构,我想将它们转换为浮点数。虚部可以丢弃,这很好。 我想知道,为什么这不起作用,而另一方面,在创建列表“数组”之前将类型更改为float会起作用。 这是一个非常基本的问题,但如果有人能分享他或她的想法,我将非常高兴。 感谢提前:)