私の理解ではArray.prototype.slice.call(arguments, 1)
、配列の末尾を返すために呼び出すことができます。
このコードが返されないのはなぜ[2,3,4,5]
ですか?
function foo() {
return Array.prototype.slice.call(arguments,1);
}
alert(foo([1,2,3,4,5]));
私の理解ではArray.prototype.slice.call(arguments, 1)
、配列の末尾を返すために呼び出すことができます。
このコードが返されないのはなぜ[2,3,4,5]
ですか?
function foo() {
return Array.prototype.slice.call(arguments,1);
}
alert(foo([1,2,3,4,5]));
渡すのは1つの引数、つまり配列だけだからです。
試すalert(foo(1,2,3,4,5));
JavaScriptでは引数は0から番号が付けられているため、スライスを1から開始し、1つの引数を渡すと、何も得られません。
arguments
オブジェクトが関数から「リーク」することを可能にするために、最適化を妨げる可能性があることに注意してください。と正式なパラメーターの間のエイリアシングのため、オプティマイザーは、オブジェクトが別の場所に送信された場合、パラメーター変数に何が起こるかわからないためarguments
、関数の静的分析を実際に行うことはできません。arguments
arguments
は、引数とその他のいくつかのプロパティ(の現在の関数への参照など)を一覧表示する配列のようなオブジェクトですarguments.callee
。
この場合、arguments
オブジェクトは次のようになります。
arguments {
0: [1,2,3,4,5],
length: 1,
other properties here
}
これはあなたがよく見ている行動を説明していると思います。関数呼び出しで配列ブラケットを削除するか、を使用arguments[0]
してarryにアクセスしてみてください。
arguments
は{0: [1,2,3,4,5], length: 1}
、1つの要素を持つ配列のようなオブジェクトであるためです。1つの要素を持つ配列の末尾は、空の配列です。
関数の定義を変更します。
function foo(arr) {
return Array.prototype.slice.call(arr,1);
}
または、次のコマンドで関数を呼び出します。
foo(1,2,3,4,5);