为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

holdtom 2019-07-01 10:35:51
为什么在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然后提醒双方myArray和copyOfMyArray..不知怎么的,当我在copyOfMyArray上执行相同的操作。myArray.然后,代码对一个数字值执行相同的操作:它声明一个变量。myNumber并将其设置为一个数字值。然后,它声明了第二个变量。copyOfMyNumber并将其设置为myNumber..它对copyOfMyNumber然后提醒双方myNumber和copyOfMyNumber..在这里,我得到了预期的行为:myNumber和copyOfMyNumber.数组与JavaScript中的数字之间的区别是,数组的更改似乎改变了数组副本的值,而当更改一个数字时并不会改变数字副本的值?我猜想,由于某种原因,数组是通过引用和数值来引用的,但为什么呢?我怎么知道其他对象会发生什么行为呢?
查看完整描述

3 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

JavaScript中的数组也是对象而变量只保存一个参照系对象,而不是对象本身。因此,这两个变量都有一个引用对象。

顺便说一下,您与数字示例的比较是不正确的。您将一个新的值分配给copyOfMyNumber..如果将新值分配给copyOfMyArray它不会改变myArray也一样。

var copyOfMyArray = myArray.slice(0);

但是请注意,这只返回浅层复制,即数组中的对象不会被克隆。


查看完整回答
反对 回复 2019-07-01
?
茅侃侃

TA贡献1842条经验 获得超21个赞

好吧,唯一可能的答案-也是正确的答案-是你.而不是真正地复制数组。当你写

var copyOfArray = array;

你在分配一个参照系到另一个变量中。换句话说,它们都指向同一个物体。


查看完整回答
反对 回复 2019-07-01
?
万千封印

TA贡献1891条经验 获得超3个赞

所以这里的每个人都做了很好的解释为什么这是真的-我只是想让你知道多么,怎样我可以很容易地解决这个问题:

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的引用,而不是实际的副本。

查看完整回答
反对 回复 2019-07-01
  • 3 回答
  • 0 关注
  • 402 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信