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

这是通过引用在javascript上调用的吗?

这是通过引用在javascript上调用的吗?

不负相思意 2021-05-08 14:12:48
我已经搜索过有关通过引用在javascript上调用的信息,但仍然感到困惑。考虑一下此代码。let arr = [];let temparr = [2,3,4];arr = temparr;temparr.push(5);console.log(arr);   //[2,3,4,5]console.log(temparr); //[2,3,4,5]let arr2 = [];let temparr2 = [2,3,4];arr2 = temparr2;temparr2 = [1,2];console.log(arr2);  //[2,3,4]console.log(temparr2);   /[1,2]对于第一种情况,由于arr = temparr,arr会受到temparr的影响,但是,在第二个示例中,arr2不会受到temparr2中的修改的影响。我的问题是在第一个示例中,为什么arr首先受到temparr的修改的影响?这是在按引用方式致电吗?如果是这样,它将在什么情况下触发该操作?在第二个示例中,唯一的区别是我没有使用push,而是分配了新数组来修改temparr2。但是这次arr2没有受到影响。与第一个示例有什么区别?非常感谢你
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞


您的问题与参数的传递方式无关(顺便说一句,所有值在JavaScript中始终通过Value传递),而与对象的存储方式有关。

在第一个示例中,与您的问题最相关的一行是:

arr = temparr;

在这里,您正在设置第二个变量,以保留与第一个变量相同的值,但是对象变量不保留对象,它们保留了内存中对象存储位置。因此,在该行之后,您有两个都指向同一个基础对象的变量。如果它们中的任何一个修改了该基础对象,则另一个将看到相同的东西,因为它们都都指向一个对象。

在第二个示例中,您以类似的方式开始:

arr2 = temparr2;

再次,它使您拥有两个指向同一基础对象的变量。但是,然后执行此操作:

temparr2 = [1,2];

它不会修改一个基础对象,它只是将第二个变量重新分配给另一个对象,现在这两个变量不再指向同一对象。

确实与说什么没什么不同:

x = 7;

然后说:

x = 8;

中的旧值x消失了,并且存储了一个全新的值。

如果要修改基础数组,则可以通过Array API进行,例如:

temparr2.splice(2,1); // Delete one item at index position 2

这就是为什么.push()在第一个示例中使用数组时会对其进行修改的原因-在对象上工作,而不是重新分配变量。


查看完整回答
反对 回复 2021-05-20
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

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