2017-01-09 51 views
0

私はforEachを使用しましたが、やや異なった動作をします。通常、要素の新しい値を割り当てるだけですが、今回は機能しませんでした。ネストされた配列で正常に動作しないことがありますか?Array.prototype.for要素の再割り当て

今スニペットのために:

//works 
this.array[0].forEach((ele,ind,arr)=>{   
      arr[ind] = 'E'; //works fine 
     }); 

//fails 
this.array[0].forEach((ele,ind,arr)=>{ 
      console.log(ele); //element is empty 
      ele = 'E'; 
      console.log(ele); //element is 'E' 
     }); 

Iは、要素自体ではなく、参照によって値によってコピーされているものと考えられます。

私はMozilla Docsを読んだが、それについては何も見つかりませんでした。

答えて

1

JavaScriptは厳密にpass/call/assign by valueです。それはあなたが

var foo = 42; 
var bar = foo; 
bar = 21; 

を行うならば、それは唯一のfoobarの値を変更しないことを意味します。したがって、ele = 'E';eleの値を変更しますが、配列には影響しません。これは常にそうであり、forEachはどんな配列に対しても全く同じように機能します。

+0

これは非常に大胆な発言です。それはまさに価値のあるものではありません。値が参照として(配列の場合のように)渡されると、参照渡しとして動作します。つまり、itemを変更すると配列に伝播します。配列の参照を変更すると、値渡しとして動作します。それは混乱です。 – lustoykov

+1

** ** **参照を渡すと** **参照とパスを混同しないでください。しかし、あなたが正しいです、参照を渡すと、JavaScriptが参照渡しだった場合と同様の効果が得られます。それでも、JavaScriptは厳密には値渡しです。 –

+0

しかし、私の理解では、値渡しはオブジェクト/配列のコピーを作成し、参照を全く渡さないでしょう。あなたがリンクしたwikiから >関数呼び出しに渡されたものは、関数が – lustoykov

関連する問題