NodeListには、すべての主要なブラウザーでforEach()が含まれるようになりました
MDNのnodeListforEach()を参照してください。
元の回答
これらの回答はいずれも、 NodeListがArrayから継承しない理由forEach
を説明していないため、残りのすべてを継承できます。
答えはこのes-discussスレッドにあります。要するに、それはウェブを壊します:
問題は、インスタンスがArray.prototype.concatと組み合わせた配列であることを意味するinstanceofを誤って想定したコードでした。
Googleのクロージャーライブラリにバグがあり、これが原因でほとんどすべてのGoogleのアプリが失敗しました。これが見つかるとすぐにライブラリが更新されましたが、concatと組み合わせて同じ誤った仮定を行うコードがまだ存在する可能性があります。
つまり、いくつかのコードは次のようなことをしました
if (x instanceof Array) {
otherArray.concat(x);
} else {
doSomethingElseWith(x);
}
ただし、concat
「実際の」配列(Arrayのinstanceではない)は他のオブジェクトとは異なる方法で処理されます。
[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標準から削除されました。