Javascript数组反向函数意外行为

时间:2016-04-24 21:00:06

标签: 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;

console.log(array1);           // ["1", "2", "3"]
console.log(array2.reverse()); // ["3", "2", "1"] Why this works ?

8 个答案:

答案 0 :(得分:10)

Situation 1

  

反向方法将调用数组对象的元素转换到位,变异数组,返回对数组的引用。

Situation 2中,您有相同的参考。您在反转之前打印array1数组

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' ]

答案 1 :(得分:6)

当您调用.reverse时,您正在反转该值,然后返回该数组。

var array1 = ["1", "2", "3"]; //Create a new array
var array2 = array1.reverse();//Reverse array1 and assign it to array2

array1所做的任何更改也会在array2中反映出来,在这种情况下会产生混淆,因为您在修改之前打印了该值。

答案 2 :(得分:4)

reverse()修改并返回原始数组。见MDN Array.prototype.reverse()

var array1 = ["1", "2", "3"];
var array2 = array1;             // point to the same object

console.log(array1);             // original array1 (["1", "2", "3"])
console.log(array2.reverse());   // reverses array2 and array1 since they
                                 //   point to the same object and returns
                                 //   array2 (["3", "2", "1"])
console.log(array1);             // check that array1 was reversed (["3", "2", "1"])
console.log(array1.reverse() === array1);   // returns true

答案 3 :(得分:2)

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

检查曼努埃尔。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse

答案 4 :(得分:2)

值得注意的是Array.reverse()会做两个事情:

  • 它通过反转来改变它给出的数组
  • 它返回对刚刚颠倒的数组的引用

让我们来看看你的例子以及发生了什么/

情况一

var array1 = ["1", "2", "3"];  // Creates new array
var array2 = array1.reverse(); // Reverse array1 and stores reference to array1 in array2

// Since array1 and array2 point to the same object, they will have
// the same values since they are pointing to the same object
console.log(array1); // ["3", "2", "1"]
console.log(array2); // ["3", "2", "1"]

情况二

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"]

在第二种情况下,在您致电array2.reverse()之后, array1array2都会被撤消,因为他们指向相同的对象引用

答案 5 :(得分:1)

问题是reverse()改变了数组本身。这意味着,如果你写var array2 = array1.reverse(),那么array1会反转。 Array1现在包含反向条目,另一方面array2用这个反向数组初始化。因此你有相同的输出。

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

答案 6 :(得分:1)

试试这个(demo

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

console.log(array1, array2);

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

答案 7 :(得分:0)

数组是javascript中的对象,因此将数组分配给另一个数组只需指定其引用,以便它们都指向同一个对象。对于这种情况,最好使用数组的切片函数将数组的数据复制到另一个,如

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

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