我已经搜索过有关通过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没有受到影响。与第一个示例有什么区别?
非常感谢您
答案 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()
时修改数组的原因--您正在处理对象,而不是重新分配变量。