2016-08-10 7 views
4

ここでは一例ですforEachはループする前にディープ・コピーを作成しますか?

arr1 = [{ b: 2 }, { a: 1 }] // an array with 2 elements 

arr1.forEach(function (element, index, array) { 

    console.log(element); 
    console.log('of'); 
    console.log(array); 
    console.log(''); 


    arr1.push({ c: 3 }); 
}); 

console.log(arr1); 

結果上記の例では

{ b: 2 } 
of 
[ { b: 2 }, { a: 1 } ] 

{ a: 1 } 
of 
[ { b: 2 }, { a: 1 }, { c: 3 } ] 

[ { b: 2 }, { a: 1 }, { c: 3 }, { c: 3 } ] 

私は、配列を横断し、それに複数の値を追加し、

をループしながら、彼らは、元の1で追加取得されています

forEachはループするために別の配列を使用しますか?

+5

[ECMAScript 2015,22.1.3.10 Array.prototype.forEach(callbackfn)](http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.foreach) - >ステップ3と8。訪問する要素の数は 'callbackfn'の最初の呼び出しの前に決定され、その後は更新されません。 – Andreas

+1

' forEach'と他の配列メソッドでは、インデックス変数は変更可能ではなく、メソッドが呼び出される瞬間を条件とします。これは、0から始まり、呼び出された瞬間に配列の長さまで増分します。それは固定されていて、たとえあなたが例外をスローしない限り、前進、遅らせる、途中で中断するようなコールバックで修正しようとしても...できません。さらに、オブジェクトのディープコピーをまったく複製するための標準JS機能はありません。 – Redu

答えて

2

console.log(array);の場合は、arr1にプッシュしても、新しい要素が表示されます。 arrayarr1は同じ配列を指しています。

しかしforEachが何をするか、少なくともはpolyfill on MDNによると、これは次のようになります。

それを反復処理する前に、それは配列の長さを抽出し、だけにして反復を開始します。したがって、配列の長さがforEachに渡される関数内で変化する場合、反復は変更されません。

// 2. Let lenValue be the result of calling the Get() internal 
// method of O with the argument "length". 
// 3. Let len be toUint32(lenValue). 
var len = O.length >>> 0; 



// 6. Let k be 0 
k = 0; 

// 7. Repeat, while k < len 
while (k < len) { 
    ... 
} 
2

アレイのコピーは作成されません。 元の配列への参照は、forEach関数の配列引数に渡されます。 以下のリンクをクリックしてください。 http://jkoder.com/foreach-method-in-arrays-functional-programming-in-javascript-part-3/

+0

潜在的な解決策へのリンクはいつでも歓迎しますが、リンクがもはや利用できない場合に備えて、将来の訪問者のためにいくつかの詳細を追加してください。 –

関連する問題