1. ホーム
  2. javascript

[解決済み] document.querySelectorAllはなぜ本当のArrayではなくStaticNodeListを返すのですか?

2022-08-04 13:45:30

質問

を実行することができないのが悩ましいです。 document.querySelectorAll(...).map(...) を実行することができないのが気になり、まだ答えを見つけることができません。

http://blowery.org/2008/08/29/yay-for-queryselectorall-boo-for-staticnodelist/

なぜ Array を取得しないのか、技術的な理由をご存知の方はいらっしゃいますか? あるいは、なぜ StaticNodeList は Array を継承しないのでしょうか? map , concat などでしょうか?

(ちなみに1つの機能だけなら NodeList.prototype.map = Array.prototype.map; ...しかし、繰り返しになりますが、そもそもなぜこの機能が(意図的に?)ブロックされているのでしょうか)

どのように解決するのですか?

私は、W3C の哲学的な決定であると信じています。W3C DOM [仕様] の設計は、JavaScript の設計とかなり直交しており、DOM は というのは であり、プラットフォームや言語に中立であるためです。

" のような決定。 getElementsByFoo() は、順序付き NodeList "または " querySelectorAll()StaticNodeList のような)言語依存の実装に基づいて返されるデータ構造の整列について、実装が心配する必要がないように、非常に意図的なものです。 .map は JavaScript と Ruby の Array で利用可能ですが ではなく にはありません)。

W3Cは低い目標を掲げています。 NodeList を含むべきであると言うでしょう。 読み出し可能な .length プロパティは、unsigned long 型です。 は、すべての実装が少なくとも その をサポートする必要があると考えるからです。 [] インデックス演算子をオーバーロードして位置指定要素の取得をサポートすべきであると明示しません。 getElementsByFoo() を実装したくても演算子のオーバーロードをサポートできないような、かわいそうな言語が現れるのを阻止したいからです。これは、仕様の大部分を通じて存在する一般的な哲学です。

John Resig は は同じような選択肢を述べました。 を提案し、それに対して を追加した。 :

私の主張は、そうではなく NodeIterator がとても DOM 的ではないということではなく、それは JavaScript 的でないということです。それは JavaScript 言語に存在する機能を利用せず JavaScript 言語に存在する機能を その能力を最大限に活用することができないのです...。

私はいくらか共感しています。もし DOM が JavaScript の機能を念頭に置いて特別に書かれていたなら、もっと厄介でなく、もっと直感的に使えるようになったでしょう。同時に、私は W3C の設計上の決定を理解しています。