web-dev-qa-db-ja.com

Array.prototype.slice.call(array、0)の用途は何ですか?

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

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

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

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

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

46
pimvdb

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

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

したがって、NodeList用にすべてを書き直すことなく、すばらしい array methods を使用できるようにするには、上記の行が役立ちます。

これを配列に変換するもう1つの用途は、リストを静的にすることです。 NodeListは通常ライブです。つまり、ドキュメントが変更された場合、NodeListオブジェクトは自動的に更新されます。 jQueryオブジェクトが返された場合、問題が発生する可能性があります。次の snippet を試して、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
75
Anurag

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

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

10
James Sulak

BoltClockが言うように、それは配列の(浅い)コピーを作成します。 ほぼ配列であるargumentsなどの配列をコピーするためにも使用できます。これには、長さと項目がありますが、プロトタイプチェーンに配列がありません(したがってスライスはありません)方法)。

6
harpo