8

私の理解では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]));
4

3 に答える 3

13

渡すのは1つの引数、つまり配列だけだからです。

試すalert(foo(1,2,3,4,5));

JavaScriptでは引数は0から番号が付けられているため、スライスを1から開始し、1つの引数を渡すと、何も得られません。

argumentsオブジェクトが関数から「リーク」することを可能にするために、最適化を妨げる可能性があることに注意してください。と正式なパラメーターの間のエイリアシングのため、オプティマイザーは、オブジェクトが別の場所に送信された場合、パラメーター変数に何が起こるかわからないためarguments、関数の静的分析を実際に行うことはできません。arguments

于 2013-02-10T23:38:44.740 に答える
13

argumentsは、引数とその他のいくつかのプロパティ(の現在の関数への参照など)を一覧表示する配列のようなオブジェクトですarguments.callee

この場合、argumentsオブジェクトは次のようになります。

arguments {
    0: [1,2,3,4,5],
    length: 1,
    other properties here
}

これはあなたがよく見ている行動を説明していると思います。関数呼び出しで配列ブラケットを削除するか、を使用arguments[0]してarryにアクセスしてみてください。

于 2013-02-10T23:41:16.823 に答える
3

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);
于 2013-02-10T23:40:09.727 に答える