2017-07-30 6 views
0

を理解する:それは述べてノートではイテレータプロトコル

反復可能プロトコルは、そのような値が for..ofに超えるループしているものとして、JavaScriptのオブジェクトは 彼らの反復動作を定義したり、カスタマイズすることができます構築する。

私がすでに使用しているときに、これがどのような利点があるかわかりません:Object.deginePropertyを使用して、何かを列挙可能にします。

function withValue(value) { 
     var d = withValue.d || (
      withValue.d = { 
       enumerable: false, 
       writeable: false, 
       configuration: false, 
       value: null 
      } 
    ) 
    // other code; 
    } 

これらのプロトコルにはどのような利点がありますか?これが単に新しいfor ... ofループを緩和するための新しい構文であれば、単に長さをチェックし、 "リスト"内の項目が不足しているかどうかを確認する以外に何のメリットがありますか?

+0

プロパティの可算数は、イテレータとはまったく関係ありません。最も重要なことに、プロパティには反復処理する**注文**がありません。 – Bergi

+0

イテレータは "リスト"よりもはるかに一般的なものです。それは長さを持つ必要はありません - あなたが望むならば、それは無限になることができます! – Bergi

+0

"*注記では、" * - 何?どこ?それはメモ? – Bergi

答えて

1

Iterableをインタフェースと考えてください。実装にはSymbol.iteratorプロパティが含まれており、next()メソッドを実装していることを保証できます。あなた自身を実装する場合は、実行時に反復処理する値を生成することができます。簡単な例として、リストを生成し、反復処理したいと思いますどのように多くの(またはその、または任意の基準)後で決める:

function List (...args) { 
    this.getOnly = function (limit) (
     const effectiveLimit = Math.min(args.length, limit + 1); 
     const iterable = { 
      [Symbol.iterator]() { 
       let count = 0; 
       const iterator = { 
        next() { 
         if (count < effectiveLimit) { 
          return { value: args[count++] }; 
         } else { 
          return { done: true }; 
         } 
        } 
       }; 
       return iterator; 
      } 
     } 
     return iterable; 
    }; 
} 

const list = List(0, 1, 2, 3, 4); 
for (const x of list.getOnly(3)) { 
    console.log(x); 
} 
// returns 0, 1, 2 

あなたが反復処理可能なインタフェースを実装するジェネレータ関数を使用する場合、同じ本当に簡単取得します。あなたが反復可能オブジェクトで何ができるかの

function List (...args) { 
    this.getOnly = function* (limit) { 
     const effectiveLimit = Math.min(args.length, limit + 1); 
     for (let count = 0; count < effectiveLimit; count++) { 
      yield args[count]; 
     } 
    } 
} 

より多くの例がhereに記載されています。

+0

'count'はイテレータ内で宣言する必要があります – Bergi

関連する問題