猿问

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

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

我编写了以下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 5alert(copyOfMyNumber); // alerts 4

这段代码声明了一个变量myArray并将其设置为数组值。然后,它声明了第二个变量。copyOfMyArray并将其设置为myArray..它对copyOfMyArray然后提醒双方myArraycopyOfMyArray..不知怎么的,当我在copyOfMyArray上执行相同的操作。myArray.

然后,代码对一个数字值执行相同的操作:它声明一个变量。myNumber并将其设置为一个数字值。然后,它声明了第二个变量。copyOfMyNumber并将其设置为myNumber..它对copyOfMyNumber然后提醒双方myNumbercopyOfMyNumber..在这里,我得到了预期的行为:myNumbercopyOfMyNumber.

数组与JavaScript中的数字之间的区别是,数组的更改似乎改变了数组副本的值,而当更改一个数字时并不会改变数字副本的值?

我猜想,由于某种原因,数组是通过引用和数值来引用的,但为什么呢?我怎么知道其他对象会发生什么行为呢?


holdtom
浏览 403回答 3
3回答

三国纷争

JavaScript中的数组也是对象而变量只保存一个参照系对象,而不是对象本身。因此,这两个变量都有一个引用同对象。顺便说一下,您与数字示例的比较是不正确的。您将一个新的值分配给copyOfMyNumber..如果将新值分配给copyOfMyArray它不会改变myArray也一样。var copyOfMyArray = myArray.slice(0);但是请注意,这只返回浅层复制,即数组中的对象不会被克隆。

茅侃侃

好吧,唯一可能的答案-也是正确的答案-是你.而不是真正地复制数组。当你写var copyOfArray = array;你在分配一个参照系到另一个变量中。换句话说,它们都指向同一个物体。

万千封印

所以这里的每个人都做了很好的解释为什么这是真的-我只是想让你知道多么,怎样我可以很容易地解决这个问题:thingArray = ['first_thing', 'second_thing', 'third_thing']function removeFirstThingAndPreserveArray(){   var copyOfThingArray = [...thingArray]   copyOfThingArray.shift();   return copyOfThingArray;}这是用.。扩展语法。编辑:关于为什么来回答你的问题:数组与JavaScript中的数字之间的区别是,数组的更改似乎改变了数组副本的值,而当更改一个数字时并不会改变数字副本的值?答案是,在JavaScript中,数组和对象是可变,而字符串、数字和其他原语是不变..当我们做一项任务时,比如:var myArray = ['a', 'b', 'c'];  var copyOfMyArray = myArray;CopyOfMyArray实际上只是对myArray的引用,而不是实际的副本。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答