NodeListがすべての主要なブラウザーでforEach()を使用するようになりました
MDNのnodeList forEach()を参照してください。
元の答え
これらの回答はどれも、 NodeListがArrayを継承しない理由を説明していないため、これを使用してforEach
残りのすべてを保持できます。
答えはこのes-discussスレッドにあります。要するに、それはウェブを壊します:
問題は、instanceofがArray.prototype.concatと組み合わされたArrayであることを誤って想定するコードでした。
Googleのクロージャライブラリにバグがあり、これが原因でほとんどすべてのGoogleのアプリが失敗しました。ライブラリはこれが見つかるとすぐに更新されましたが、concatと組み合わせて同じ誤った仮定を行うコードがまだそこにある可能性があります。
つまり、いくつかのコードは次のようなことをしました
if (x instanceof Array) {
otherArray.concat(x);
} else {
doSomethingElseWith(x);
}
ただし、concat
「実際の」配列(instanceof Arrayではない)は他のオブジェクトとは異なる方法で処理されます。
[1, 2, 3].concat([4, 5, 6]) // [1, 2, 3, 4, 5, 6]
[1, 2, 3].concat(4) // [1, 2, 3, 4]
つまり、上記のコードx
は、NodeListがdoSomethingElseWith(x)
パスを下る前に壊れたのに対し、その後、otherArray.concat(x)
パスを下っていったためx
、実際の配列ではなかったため、奇妙なことをしました。
しばらくの間Elements
、Arrayの実際のサブクラスであり、「新しいNodeList」として使用されるクラスの提案がありました。ただし、技術的および仕様に関連するさまざまな理由により、まだ実装することができなかったため、少なくとも現時点ではDOM標準から削除されています。