-3
function foo() { 
   return 1,2,3; 
}

console.log(foo()); // prints 3
console.log([].push(foo())); // prints 1

なぜこれが起こるのですか?

4

3 に答える 3

6

それは奇妙ではありません。3配列にプッシュされる を返しているため、メソッド.push()は新しい長さ を返します1

呼び出しをログに記録せず、.push()呼び出しだけをログに記録すると、foo()単に返された が表示され3ます。

明確にするために、これを行うと:

return 1,2,3;

最後のコンマ演算子の結果を返します。これは最後の式であり、3.


すべての値を配列にプッシュしたい場合は、値の配列を返す必要があります。これは、JavaScript が許可する戻り値は 1 つだけだからです。

function foo(){ return [1,2,3]; }

console.log(foo()); // prints [1,2,3]
console.log([].push.apply([], foo())); // prints 3

以前.apply()は を呼び出し.push()ていたので、返された Array のメンバーを個別の引数として渡します。

于 2013-10-30T23:57:11.800 に答える
3

で区切られた式のリストの,値は、最後の式の値です。したがって、

function foo(){ return 1,2,3; }

と同等です

function foo(){ return 3; }

[].push(foo())を返す理由については、いくつかのドキュメント3を読むだけで明らかです。配列の新しい長さを返します。Array.push()push

于 2013-10-30T23:57:19.483 に答える
1

質問 1 「1,2,3」を返すことは、JavaScript で複数の値を返すための適切な構文ではありません。あなたの構文は、最後の数字「3」を戻り値として渡すことになるようです。

var test = foo()
typeof test
"number"

複数のデータを渡す正しい方法については、これを参照してください: JavaScript で複数の値を返しますか?

質問2

console.log([].push(foo())); // prints 1

元の関数によって単一の数値「3」が出力されるため、プッシュは新しい配列の長さ「1」を返すため、これは正しいです。

于 2013-10-31T00:03:16.593 に答える