2016-05-13 5 views
1

ループ反復変数var i=0; i<length; i++を使用するときには、非常に冗長で絶対的なやり方であり、必要でなくても項目のインデックスを提供するので、私たちは常にループの絶対的な方法を避けたいという考えを理解しています。アレイ上の.forEach()方法は、宣言的なアプローチでval(および必要に応じてのみindex)を露光することによりこれを解決しているようだ:ES2015で、forEachを既に使用している場合、なぜ新しいループ構成が必要になるのですか?

var arr = [1, 2, 3, 4]; 
arr.forEach(function (val) { 
    // Use val 
}); 

私はES6構造物を通過して、新たなfor-ofループ構造を見てきました。試してみると私の質問は次のようになります:

言語で定義されている2つの新しい構造体が必要なのはなぜですか?上記の2つのループ構成では実現できない機能は何ですか?

+2

iterablesを一貫して繰り返します。 –

+4

'for..of'は(潜在的に)無限のシーケンスジェネレータで動作します。 '.forEach()'でそれを行うことはできません。 – nnnnnn

+2

'for'ループは冗長ではありません。私は 'forEach'のあなたのキャラクタライゼーションを「宣言的」として扱います。それは(適度に)「機能的」だが、依然として完全に手続き的/命令的である。副次的な点ですが、 'for ... of'の変数は分解できますので、' for([a、b]対の ')を書くことができます。 –

答えて

1

言語で定義された2つの新しい構造体が必要なのはなぜですか?上記の2つのループ構成では実現できない機能は何ですか?

この引数は、ES2015の多くの新機能に対して使用できます。矢印の機能、let、残りのパラメータ、破壊などは、あなたがすでにJSで行うことができるものの文法的な砂糖です。 ES2015をES5に変換するBabelのようなツールは、それを証明します。

したがって、構文的な砂糖のポイントは何ですか?定型コードを減らし、エンジニアがにフォーカスするようにするには、というコードではなく、のコードを使用します。を実行する必要があります。


としては既に、任意反復可能(イテレータを返す[Symbol.iterator]方法を実装するもの)にfor...of作品だけでなく、アレイを指摘しました。配列は単純にiterableです。

for...ofは、既存の構文(afaik)では実行できなかったことを実際には紹介していません。 whileループのイテレータを使用することができます。

for (var foo of bar) { 
    // ... 
} 

はしかし、それは本当に理解して(またはライト)が容易ではありません

var it = bar[Symbol.iterator](), next; 
while ((next = it.next()).done !== false) { 
    var foo = next.value; 
    // ... 
} 

に相当します。 iterablesがより一般的な/一般的になるはずだと仮定すると、iteratorを消費するためのより良いサポートが妥当と思われます。

+0

したがって、物語の要点は、ES6にはMap、Sets、Generatorsなどの複数のタイプのコレクション/イテラブルがあり、for-ofを使ってイテレータを簡単に使用できることです。右? –

+0

はい!!... –

+0

素晴らしいです。どうもありがとう :) –

-1

理由は、新しい機能を追加するのではなく、便利さです。私はこれについてGithubのNotesレポに書いています。私は、直接それをここに言い換えます:

前ES5に、ループのためにこのように書かれています。

ES5で
for (var i = 0; i < arr.length; i++) { 
    // Do something 
} 

、我々はこのようにそれを書き込むことができます。

arr.forEach(function(elem) { 
    // Do something 
}); 

前者の利点は、w真ん中のループから逃れることができます。 後者の利点は簡潔です。 ES6は、それらの両方を組み合わせて、-のためと呼ばれる新しい構文が導入されています

for (let elem of arr) { 
    // Do something 
} 
+2

私はほとんど完全に同意しません。それは便宜上のことではありません。それはES6でiterablesの概念全体をサポートすることです。また、 'forEach'の利点は簡潔であるとは言いません(少なくとも排他的ではありません)。それから、あなたの最終的な例は間違っています。これはあなたが思うように思えるようには全く機能しません。 'for..of'でインデックスを維持する唯一の方法は、それを自分で維持することです。 –

+0

@torazaburo、あなたはインデックス作成の部分について正しいです。私はそれを誤解していたに違いない。私はそれを削除します。 –

2

forEachArray.prototypeに存在するが、配列は、我々は反復処理のみのタイプではありません。 ES6では多くのものが紹介されており、for...ofはカスタムタイプの反復動作を実装する一貫した方法を提供します。

関連する問題