2017-06-07 85 views
0

考虑下面的代码片段:为什么推到一个数组会影响另一个数组?

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被修改?

+0

* “在过去的console.log,为什么力推ARR2影响ARR3?” * - 它没有。最后一个日志记录'arr1',而不是'arr3'。 – nnnnnn

+0

@nnnnnn我的编辑错误,修复 – Li357

回答

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

在JavaScript mutates the arrayreverse()方法。这意味着它会更改数据(位于变量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
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. 分裂()函数返回一个新的数组。()函数不返回新数组。所以,arr1是arr2。
  2. push()函数不会返回一个新数组。所以,arr1和arr2添加了arr3作为最后一个元素。

使用slice()函数来制作数组的副本。

参考文献:

split function

reverse function

push function

相关问题