2017-01-20 3 views
5

DOM4がNodeListの反復可能になり:for(Symbol.iterator)でHTMLCollectionを反復できますか?

interface NodeList { 
    getter Node ? item (unsigned long index); 
    readonly attribute unsigned long length ; 
    iterable< Node >; 
};

WebIDLによれば、これは、値の配列を取得するために反復処理される反復可能 支持体であることが宣言されているインターフェースを実装

オブジェクトを意味します。

注のECMAScript言語の結合、反復可能なそのinterface prototype objectの「エントリ」、「forEachの」、「キー」、「値」と @@iterator特性を有する あるインターフェース。

したがって、次が可能です:

for (var el of document.querySelectorAll(selector)) ... 

私は同じことが、両方のFirefoxとChromeで、HTMLCollectionsのために働くようだ気づい:実際には

for (var el of document.getElementsByTagName(tag)) ... 

、私は

を取得
HTMLCollection.prototype[Symbol.iterator] === [][Symbol.iterator]; // true 

ただし、HTMLCollectionはありません反復可能として定義:

interface HTMLCollection { 
    readonly attribute unsigned long length ; 
    getter Element ? item (unsigned long index); 
    getter Element ? namedItem (DOMString name); 
};

は、私はまた、WHATWG DOM specをチェックし、それが反復可能でもないではありません。

次に、この動作基準はありますか? @@iteratorがプロトタイプにあるとしますか?HTMLCollectionはありますか? for..of...spread

それは@@iteratorを保存プロパティに対して[[Get]]操作のためのイテレータを返す場合何が反復可能である:事実上iterableの構造を持っているすべてのもののようないくつかの反復エンジン操作を経ることができ、JavaScriptで

+0

http://stackoverflow.com/a/31574921/2813224 – zer00ne

答えて

4

私はそれを見つけ、それがWebIDLで説明しています:

interface次のいずれかを持っている場合:

は、プロパティは、名前属性を持つ@@iteratorシンボル、 で存在している必要があります{[[Writable]]:true、[[Enumerable]]:false, [[構成可能]]:}と値がfunction objectです。 [...]はインターフェイスindexed property getterを定義

場合、 機能オブジェクトが%ArrayProto_values%あります。この場合

、HTMLCollectionsは、インデックス付きプロパティのゲッターを持っている:

getter Element ? item (unsigned long index);

と「長さ」という名前の整数型指定された属性:

readonly attribute unsigned long length ;

ので、はい、動作するようになっています。実際には、反復可能として宣言されていなくても、ノードリストに対しても機能しますが、entries,forEachkeysおよびvaluesプロパティはありません。 @lonesomedayのように、namedItemゲッターが任意の文字列を受け入れるため、これらのメソッドを追加すると下位互換性がないため、HTMLCollectionが反復可能として定義されていない可能性があります。

+0

私は* HTMLCollectionの 'namedItem'メソッドまたはステートメントのために*推測*するつもりです。注:要素は要素のコレクションを表現するためのより良い解決策です.HTMLCollectionは歴史的なアーティファクトです。 」のウェブ。 – lonesomeday

+2

@lonesomedayはい、それは 'namedItem'が文字列を受け入れるので、' forEach'のようなプロパティを追加すると物が壊れる可能性があります。 – Oriol

0

その場合は明らかにHTMLCollectionがこのようなオブジェクトを返します。

return() {method}: stops iterator and returns IteratorResult 
throw() {method}: signals error and returns IteratorResult 

これは反復可能であり、完全なカスタム・オブジェクトの一例であることもnext() {method}:、および2つの他の任意の方法:それは持っている場合

反復子は、それ自体がカウントされます。

限り HTMLCollectionあなたは for..of...spreadを適用することができ、適切なイテレータを返しますが、これは私が私が持っていないことを伝えるために持っているよりも仕様を満たしている天気をあなたの懸念があるかのようにあなたのケースではそう
const calculations = { 
     counting: 1, 
     [Symbol.iterator]: function(){ return this; }, 
     next: function(){ 

     if(this.counting <= 3){ 

      return { 
      value: this.counting++, 
      done: false 
      } 
     } 

     return { value: this.counting, done: true} 
     } 
    }; 

const data = ...calculations; // [1,2,3] 

、まだ学士コンピュータサイエンスの学位:P

+0

おかげで、私はすでに@@ iterator' 'を知っていた、私の懸念は、私はこれが依存だと思う' HTMLCollection'が適切なイテレータ – Oriol

+0

@Oriolを返すことになっているかどうかであります実装上。 HTMLCollectionインターフェイスにはイテレータの宣言はありませんが、実装されたときに別のインターフェイスも含めることができます。この場合、HTMLCollectionとNodeListは十分に反復可能なコレクションを表しています。 – Burimi

関連する問題