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

时间:2019-05-02 17:10:26

标签: 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的修改的影响。我的问题是,

  1. 在第一个示例中,为什么arr首先受到temparr的修改的影响?这是否是按引用的方式?如果是这样,它将在什么情况下触发该操作?

  2. 在第二个示例中,唯一的区别是我没有使用push,而是分配了新数组来修改temparr2。但是这次arr2没有受到影响。与第一个示例有什么区别?

非常感谢您

1 个答案:

答案 0 :(得分:1)

您的问题与参数的传递方式无关(顺便说一下,everything is passed by Value在JavaScript中一直如此),而与对象的存储方式有关。

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

arr = temparr;

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

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

arr2 = temparr2;

这又将您设置为具有两个指向同一基础对象的变量。但是,然后您执行此操作:

temparr2 = [1,2];

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

这与说真的没什么不同

x = 7;

然后说:

x = 8;

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

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

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

这就是在第一个示例中使用.push()时修改数组的原因--您正在处理对象,而不是重新分配变量。