2017-06-07 83 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

相關問題