Javascript数组反向函数意外行为

Javascript数组反向函数意外行为,javascript,Javascript,我想理解为什么情况1和情况2不返回相同的结果 情景1: var array1 = ["1", "2", "3"]; var array2 = array1.reverse(); console.log(array1); // ["3", "2", "1"] console.log(array2); // ["3", "2", "1"] Why this doesn't work ? 情景2: var array1 = ["1", "2", "3"]; var array2 = array1;

我想理解为什么情况1和情况2不返回相同的结果

情景1:

var array1 = ["1", "2", "3"];
var array2 = array1.reverse();

console.log(array1); // ["3", "2", "1"]
console.log(array2); // ["3", "2", "1"] Why this doesn't work ?
情景2:

var array1 = ["1", "2", "3"];
var array2 = array1;

console.log(array1);           // ["1", "2", "3"]
console.log(array2.reverse()); // ["3", "2", "1"] Why this works ?
调用时,将反转该值,然后返回数组

var array1 = ["1", "2", "3"]; //Create a new array
var array2 = array1.reverse();//Reverse array1 and assign it to array2
array1
所做的任何更改也会反映在
array2
中。在这种情况下,由于您在修改值之前打印了该值,因此产生了混淆。

reverse()
修改并返回原始数组。看


情况1中


反向方法将调用数组对象的元素转置到位,对数组进行变异,并返回对数组的引用

var array1 = ["1", "2", "3"]; //Create a new array
var array2 = array1.reverse();//Reverse array1 and assign it to array2
情况2中
您有相同的参考。您正在打印
array1
array,然后将其反转

var array1 = ["1", "2", "3"];
var array2 = array1;

console.log(array1);           // [ '1', '2', '3' ]
console.log(array2.reverse()); // [ '3', '2', '1' ]
console.log(array1);           // [ '3', '2', '1' ]

问题是
reverse()
更改数组本身。这意味着,如果您写入
var array2=array1.reverse()
,则array1被反转。Array1现在包含反转的条目,而在另一侧,array2则使用此反转的数组进行初始化。因此,您有相同的输出

在第二个示例中,使用
var array2=array1
有两个变量引用同一个数组。
首先,按正常顺序打印出数组1。作为第二步,您反转array2并将其打印出来。现在顺序已经改变了。但是如果现在再次打印array1,结果将是数组的顺序相反,因为array1和array2引用同一个数组。

反向方法将调用数组对象的元素转置到位,改变数组,并返回对数组的引用。因此,它不会返回反向数组

检查手册。

需要注意的是,它有两个作用:

  • 它通过反转来改变给定的数组
  • 它返回对刚刚反转的数组的引用
让我们来看看你的例子和发生了什么/

情景一 情景二 在第二种情况下,在调用
array2.reverse()
后,
array1
array2
都会反转,因为它们指向同一个对象引用。

试试这个()


使用
slice(0)
创建一个新数组。

数组在javascript中是对象,因此将一个数组分配给另一个数组只需分配其引用,这样两个数组都将指向同一个对象。而对于这种情况,最好使用数组的slice函数将数组的数据复制到另一个类似的对象

var array1 = ["1", "2", "3"];
var array2 = array1.slice().reverse();

console.log(array1); // ["1", "2", "3"]
console.log(array2); // ["3", "2", "1"]

第二个示例的建议输出不正确。这会增加你的困惑吗?非常感谢。更正。这只是一个简单的复制/粘贴错误,不,这并没有增加我的困惑。我投了反对票。尽管这个问题很受欢迎,但它是一个研究努力不足(不阅读文档)的例子。标题也很糟糕,这意味着它不会帮助很多可能有这个问题的谷歌用户。哦,哇,我刚刚注意到在情况1中,返回了[“3”、“2”、“1”],而不是[“1”、“2”、“3”]。。。我以为我在自己的情况下创建了两个数组,但我只创建了两个指向同一数组的指针,对吗?@m-a.D正确-实际上只有两个数组指向同一个对象,所以其中一个数组的更改会影响这两个数组(有关更多详细信息,请参阅我的答案)。
var array1 = ["1", "2", "3"];  // Creates new array
var array2 = array1;           // array2 now holds a reference to array1

// Same as the previous example, array1 and array2 both have the
// same values since they are pointing to the same object    
console.log(array1);           // ["1", "2", "3"]

// Now we reverse array2, which reverses array1 AND array2
console.log(array2.reverse()); // ["3", "2", "1"]

// array1 is now also reversed
console.log(array1);           // ["3", "2", "1"]
var array1 = ["1", "2", "3"];
var array2 = array1.slice(0).reverse();

console.log(array1, array2);
var array1 = ["1", "2", "3"];
var array2 = array1.slice().reverse();

console.log(array1); // ["1", "2", "3"]
console.log(array2); // ["3", "2", "1"]