<注>
そのリンクされた回答からの実際のコードは次のとおりです。
var args = Array.prototype.slice.call(arguments, 1);
つまり、「スプライス」ではなく「スライス」
</ Note>
まず第一に、このslice
メソッドは、呼び出された配列のコピーを作成するためによく使用されます。
var a = ['a', 'b', 'c'];
var b = a.slice(); // b is now a copy of a
var c = a.slice(1); // c is now ['b', 'c']
つまり、簡単な答えは、コードが基本的にエミュレートしているということです。
arguments.slice(1); // discard 1st argument, gimme the rest
ただし、それを直接行うことはできません。特別なarguments
オブジェクト(すべてのJavaScript関数の実行コンテキスト内で使用可能)は、数値キーを使用した演算子によるインデックス作成をサポートするという点で配列に似[]
ていますが、実際には配列ではありません。あなたはそれ.push
に上に、.pop
それから、または.slice
それなどに乗ることはできません。
コードがこれを実現する方法は、関数(これもオブジェクトslice
では使用できません)を「トリック」して、次のコンテキストで実行することです。arguments
arguments
Function.prototype.call
Array.prototype.slice // get a reference to the slice method
// available on all Arrays, then...
.call( // call it, ...
arguments, // making "this" point to arguments inside slice, and...
1 // pass 1 to slice as the first argument
)
Array.prototype.slice.call(arguments).splice(1)
同じことを実行しますが、への無関係な呼び出しを行いますsplice(1)
。これにより、インデックスから始まり、配列の最後まで返される配列から要素が削除されます。IEでは機能しません(IEとECMAScriptに必要なアイテムの数を示す2番目のパラメーターが技術的に欠落しています)。Array.prototype.slice.call(arguments)
1
splice(1)