为什么推送到一个阵列影响另一个?

时间:2017-06-07 02:22:24

标签: javascript arrays

请考虑以下代码段:



var arr1 = "john".split('');
console.log(arr1); // [ 'j', 'o', 'h', 'n' ]
var arr2 = arr1.reverse();
console.log(arr1); // [ 'n', 'h', 'o', 'j' ]
var arr3 = "jones".split('');
arr2.push(arr3);
console.log(arr1); // [ 'n', 'h', 'o', 'j', [ 'j', 'o', 'n', 'e', 's' ] ]




在上一个console.log中,为什么推送到arr2会影响arr1?为什么arr1在未修改时会发生变化,只有arr2被修改?

3 个答案:

答案 0 :(得分:2)

JavaScript mutates the array中的reverse()方法。这意味着它会在arr1变量中更改数据 - 然后返回对该数组的引用。因此arr2只是对arr1的引用,而不是一组新数据。

如果你想要全新的数据,你可以按照他们在StackOverflow question中所说的那样做:

var arr2 = arr1.slice().reverse();

这将slice一组新数据然后反转它,因此返回一个新数组而不是对第一个数组的引用。

示例:



var array = ['a', 'b', 'c', 'd', 'e'];

var notmutated = array.slice();
console.log('not mutated:', notmutated);

var mutated = array.reverse();
console.log('mutated: ', array);




答案 1 :(得分:1)

您的代码对arr1进行了两处修改。

  

var arr2 = arr1.reverse();

函数Array.prototype.reverse()反转数组到位。这意味着arr1将自行撤销。

此外,在分配对象时,您只是传递对它们的引用,因此在此行之后arr2实际上是arr1(反向)。

  

arr2.push(ARR3);

由于您已将arr2指定为arr1的引用,因此您在此行中实际修改arr1,相当于撰写arr1.push(arr3)

要从数组创建新对象,可以使用函数Array.prototype.slice(),因为此方法返回数组的副本

var arr1 = "john".split('');  
console.log(arr1); // [ 'j', 'o', 'h', 'n' ]
var arr2 = arr1.slice().reverse(); 
console.log(arr1); // [ 'j', 'o', 'h', 'n' ]
var arr3 = "jones".split(''); 
arr2.push(arr3);
console.log(arr1);  // [ 'j', 'o', 'h', 'n' ]

答案 2 :(得分:-1)

var arr1 = "john".split('');  
console.log(arr1); // [ 'j', 'o', 'h', 'n' ]
var arr2 = arr1.slice().reverse(); 
console.log(arr2); // [ 'n', 'h', 'o', 'j' ]
var arr3 = "jones".split(''); 
arr2.push(arr3);
console.log(arr1);  // [ 'j', 'o', 'h', 'n' ]
console.log(arr2);  // [ 'n', 'h', 'o', 'j', ['j','o','n','e','s'] ]
  1. split()函数返回一个新数组。
  2. reverse()函数不返回新数组。所以,arr1是arr2。
  3. push()函数不返回新数组。因此,arr1和arr2已将arr3添加为最后一个元素。
  4. 使用slice()函数制作数组的副本。

    参考文献:

    split function

    reverse function

    push function