2

多くの JavaScript ライブラリ (jQuery、Zepto) は、querySelectorAll()、getElementsByTag、または ClassName の結果で Array.prototype.slice.call を呼び出しているようです...

StackOverflow で多くの同様の質問/回答を読んだことから、NodeList の結果を実際の配列に変換して、NodeLists では利用できない結果で配列メソッド (スライス、ポップ) を呼び出すことができることを理解しています。わからないのはなぜですか?通常、DOM ノードのリストでスライス/ポップを実際に必要とすることはありません + NodeLists にはすでに length プロパティがあるため、とにかくトラバース可能です。

NodeList がライブ DOM オブジェクトを指しているため、いくつかの回答が暗示されているようです。しかし、これを配列に変換すると、参照はまだライブ DOM ノードを指しています。違いは何ですか?

それとも、私が完全に見逃しているものですか?Zepto/jQuery が何らかの形で DOM 要素の複数のプロパティ呼び出しをキャッシュするのに役立ちますか? (ただし、それらはまだライブDOM参照であるため、実際にはわかりません)

4

2 に答える 2

2

通常、DOM ノードのリストにスライス/ポップは必要ありません。

実際、あなたはそうしています、そしてそれがまさにそれが必要な理由です.

たとえば、他に 、 などはどのように機能します.eq().first()。jQuery オブジェクトには配列内の のコピーが含まれてNodeListおり、個々のメソッドはその配列のスライスを取得します。.add()同様に、 にノードを作成することはできませんNodeList

さらに、これらの配列は、その中の要素がその後 DOM から削除された場合でも有効なままである必要があります。配列内の参照は引き続き有効であり、これらの要素を DOM に再挿入するために使用できます。

あなたが持っていたのがライブだけだった場合NodeList、要素はDOMから削除されると自動的にリストから消え、それらへの個別の参照がない限り永久に失われます.

于 2012-11-08T18:39:09.717 に答える
0

... NodeList がライブ DOM オブジェクトを指しているため...

いいえ、これは誤解です。重要なのは、リスト内の各ノードが「生きている」DOM オブジェクトであるということではありません (本当ですが無関係です) 。リスト自体が「生きている」ということです。つまり、リストの内容は、DOM が変更されるたびにいつでも変更 (または拡大または縮小) される可能性があります。

リスト内の項目に対して DOM を変更する操作を実行すると、リストを使用している間にリスト自体がオンザフライで変更される場合があります。つまり、あなたのコードは、気付かないうちに、またソース コードにほとんど何も示されていないにもかかわらず、裏で非常に奇妙な再帰やパフォーマンスの問題に陥る可能性があることを意味します。

NodeList を通常の Javascript Array に変換すると、リスト自体のこの「活性」が失われるため、自分自身を撃つ機会がなくなります。

于 2013-11-19T20:40:48.070 に答える