我想了解为什么情况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 ?
答案 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()
之后, array1
和array2
都会被撤消,因为他们指向相同的对象引用
答案 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"]