测试1:
var arr1 = [10, 20];
var arr2 = arr1;
arr2[0]++;
alert(arr1);// [11, 20] --- What?!?!
alert(arr2);// [11, 20] --- correct
测试2:
var arr1 = [10, 20];
var arr2 = [arr1[0], arr1[1]];
arr2[0]++;
alert(arr1);// [10, 20] --- correct
alert(arr2);// [11, 20] --- correct
在测试1中,为什么第一个数组的第一个元素被改变了?
据我所知,在其他OOP语言中,如Java& PHP,如果我们执行Test 1的var arr2 = arr1;
这称为“引用”,一旦我们用新变量的值改变某些东西,它就会为它创建一个新值,这样第一个引用“arr1”就不会受到影响。为什么它在Javascript中不一样!?这完全没有意义!这是一个错误吗?或者只是Javascript的行为不同?
答案 0 :(得分:3)
JavaScript变量将引用到对象。当变量“是”一个对象时,它包含对该对象的引用。将此类变量的值分配给另一个变量只是传输引用;它不制作引用对象的副本。
答案 1 :(得分:1)
在测试1中,两个变量都引用相同的数组对象,因此您在一个上执行的任何操作都会反映在另一个上。
另一方面,在测试2上,您将值复制到一个新数组中,因此每个变量都引用不同的数组对象。
编辑:删除" passby"术语
编辑2:在旁注上,这也发生在java中。