猿问

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

我已经搜索过有关通过引用在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没有受到影响。与第一个示例有什么区别?


非常感谢你


不负相思意
浏览 126回答 1
1回答

哆啦的时光机

您的问题与参数的传递方式无关(顺便说一句,所有值在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()在第一个示例中使用数组时会对其进行修改的原因-在对象上工作,而不是重新分配变量。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答