46

Sizzleのソースコードを閲覧していたところ、次のコード行に出くわしました。

array = Array.prototype.slice.call( array, 0 );

関数が何であるかを調べましたが、インデックス0から始まる配列のすべての要素を返すだけで、全体を配列に入れる、つまり実際には何もしないという結論に達しました。

したがって、このコード行の用途は何ですか?私は何が欠けていますか?

編集:https://github.com/jquery/sizzle/blob/master/sizzle.js#L863の863行目です。

4

3 に答える 3

76

DOMは通常、のNodeListようなほとんどの操作に対してを返しますgetElementsByTagName

NodeListほとんど配列のように感じますが、そうではありません。length配列のようなプロパティと、指定されたインデックスのオブジェクトにアクセスするためのメソッド(item(index)表記法でもアクセス可能[index])がありますが、ここで類似性が終了します。

したがって、すべてを書き直さずにすばらしい配列メソッドを使用できるようにするにはNodeList、上記の行が役立ちます。

それを配列に変換する別の使用法は、リストを静的にすることです。NodeListは通常ライブです。つまり、ドキュメントの変更が発生すると、NodeListオブジェクトは自動的に更新されます。返されたjQueryオブジェクトがすぐに変更され続けると、問題が発生する可能性があります。次のスニペットを試して、NodeListの活性をテストしてください。

var p = document.getElementsByTagName('p');
console.log(p.length); // 2
document.body.appendChild(document.createElement('p'));
// length of p changes as document was modified
console.log(p.length); // 3
于 2011-02-28T17:13:31.870 に答える
11

ここで起こっていることは、Sizzleが配列のようなオブジェクトから実際の配列を作成しているということです。配列のようなオブジェクトには必ずしもslice()メソッドがないため、プロトタイプメソッドを直接呼び出す必要があります。 makeArray()実際の配列であるその配列のようなオブジェクトのコピーを返し、他の場所でそのまま使用できます。

配列のようなオブジェクトの詳細については、ここを参照してください。

于 2011-02-28T17:09:59.260 に答える
6

BoltClockが言うように、配列の(浅い)コピーを作成します。また、組み込みのように、長さと項目はあるがプロトタイプチェーンに配列がない(したがってスライスメソッドがない)ほぼ配列であるものをコピーするために使用することもできます。arguments

于 2011-02-28T17:06:10.533 に答える