Javascript:数组的简单但奇怪的行为?
测试1: 测试2:Javascript:数组的简单但奇怪的行为?,javascript,arrays,Javascript,Arrays,测试1: 测试2: var arr1 = [10, 20]; var arr2 = arr1; arr2[0]++; alert(arr1);// [11, 20] --- What?!?! alert(arr2);// [11, 20] --- correct 在测试1中,为什么更改第一个数组的第一个元素? 据我所知,在Java和PHP等其他OOP语言中,如果我们进行测试1的var arr2=arr1这称为“引用”,一旦我们用新变量的值更改了某些内容,它将为此创建一个新值,这样第一个引用
var arr1 = [10, 20];
var arr2 = arr1;
arr2[0]++;
alert(arr1);// [11, 20] --- What?!?!
alert(arr2);// [11, 20] --- correct
在测试1中,为什么更改第一个数组的第一个元素?
据我所知,在Java和PHP等其他OOP语言中,如果我们进行测试1的
var arr2=arr1代码>这称为“引用”,一旦我们用新变量的值更改了某些内容,它将为此创建一个新值,这样第一个引用“arr1”就不会生效。为什么它在Javascript中不一样!?这完全没有道理!是虫子吗?或者只是Javascript的行为不同?在测试1中,两个变量都引用同一个数组对象,因此您在其中一个上所做的任何操作都将反映在另一个上
另一方面,在测试2中,您将值复制到一个新数组中,因此每个变量都引用不同的数组对象
编辑:删除“passby”术语
编辑2:另一方面,这在java中也会发生。在测试1中,两个变量都引用同一个数组对象,因此您在其中一个上所做的任何操作都将反映在另一个上
另一方面,在测试2中,您将值复制到一个新数组中,因此每个变量都引用不同的数组对象
编辑:删除“passby”术语
编辑2:另一方面,java中也会发生这种情况。JavaScript变量引用对象。当变量“是”对象时,它包含对该对象的引用。将这样一个变量的值赋给另一个变量只是传递引用;它不会复制引用对象。JavaScript变量引用对象。当变量“是”对象时,它包含对该对象的引用。将这样一个变量的值赋给另一个变量只是传递引用;它不会复制引用对象。这确实不正确。这里没有“通行证”。术语“按值传递”和“按引用传递”与函数调用的语义有关
.lol,真正的传递意味着作为函数/方法中的参数,但它的思想是一样的。@EdwardM.B。这是一个相关的概念,但严格来说,它们实际上是两个完全不同的东西。很多语言都是这样做的。最大的例外是真正的函数式语言,其中数据是不可变的。这确实是不正确的。这里没有“通行证”。术语“按值传递”和“按引用传递”与函数调用的语义有关.lol,真正的传递意味着作为函数/方法中的参数,但它的思想是一样的。@EdwardM.B。这是一个相关的概念,但严格来说,它们实际上是两个完全不同的东西。很多语言都是这样做的。最大的例外是真正的函数式语言,其中数据是不可变的。查找“javascript深度复制”与“javascript浅层复制”查找“javascript深度复制”与“javascript浅层复制”
var arr1 = [10, 20];
var arr2 = [arr1[0], arr1[1]];
arr2[0]++;
alert(arr1);// [10, 20] --- correct
alert(arr2);// [11, 20] --- correct