Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:数组的简单但奇怪的行为?_Javascript_Arrays - Fatal编程技术网

Javascript:数组的简单但奇怪的行为?

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这称为“引用”,一旦我们用新变量的值更改了某些内容,它将为此创建一个新值,这样第一个引用

测试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这称为“引用”,一旦我们用新变量的值更改了某些内容,它将为此创建一个新值,这样第一个引用“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