2011-02-28 22 views
46

私はシズルのソースコードを閲覧されたと私はこのコード行に出くわした:Array.prototype.slice.call(array、0)の使い方は?

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

私は機能が何であるかを見上げたが、私はそれがちょうどから始まる配列のすべての要素を返すという結論になりましたインデックス0を返し、全体を配列に入れます。つまり、実際には何もしません。

したがって、このコード行はどのようなものですか?私は何が欠けていますか?

編集:これは863からhttps://github.com/jquery/sizzle/blob/master/sizzle.js#L863までです。

+1

配列のコピーを作成する 'array.slice(0)'を呼び出すのにやや懐かしい方法のようです。私はなぜこのような不可解な方法で呼び出されているのかわかりません。 – spender

+8

コンテキストがすべての違いを作ります。 'array'識別子は実際の配列を参照していません。 – user113716

答えて

75

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

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

素晴らしいarray methodsNodeListのすべてを書き換えずに使用できるようにするには、上記の行が便利です。

これを配列に変換するもう1つの方法は、リストを静的にすることです。ノードリストは通常​​はライブです。つまり、ドキュメントの変更が発生した場合、NodeListオブジェクトは自動的に更新されます。それはあなたに返されたjQueryオブジェクトがあなたの鼻の下で正しく変化し続けている場合に問題を引き起こす可能性があります。次のsnippetを試して、NodeListsの有効性をテストしてください。

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 
+3

この答えは、JSを実際に受け入れることに一歩近づいてしまいます。私は何年もの間それが消えることを望んでいました...とにかくあなたに+1してください。 – Lee

+0

私は、どのようなオブジェクトが配列メソッドを適用できるのか、どのように知っていますか?どうやら、lengthプロパティと整数プロパティ名(ゼロから始まる?)を持つオブジェクトです。私はまた、 "引数"変数はオブジェクトのような配列だが、実際の配列ではないことを知った(私は知らなかった)。答えはここにありました:http://stackoverflow.com/questions/7056925/how-does-array-prototype-slice-call-work – zod

+1

@zod:[V8の実装](http://code.google.com .com/p/v8/source/browse/trunk/src/array.js#617)[それは思われません](http://code.google.com/p/v8/source/browse/trunk/ src/array.js#321)は何か魔法のように起こります。それは '.length'を使って範囲を決定し、' for'ループは正しい要素(数値キーを持つオブジェクトを必要とするだけです)をコピーします。 – pimvdb

6

BoltClockによれば、配列の(浅い)コピーが作成されます。また、であるの配列をコピーするのに使用することもできます(arguments組み込み、長さとアイテムはありますが、プロトタイプチェーンに配列がないためスライスメソッドはありません)。

+0

私はそう思っていましたが、結果を同じ '配列 'に戻します。実際に何が起こっているのかは分かりません。 – BoltClock

+0

なぜ 'var'がその前に置かれていないのか聞いてもよろしいですか?コピーが作成された場合、それは新しい変数、つまり 'var'ではないでしょうか? – pimvdb

+0

@BoltClock、Hmmm ...それは奇妙です。おそらく引数やjQueryのようなものではないものにArrayプロトタイプを渡すのがよいでしょう。 – harpo

10

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

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

関連する問題