-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 只允许一个返回值。

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

这是正确的,因为 push 返回新数组“1”的长度,因为原始函数输出单个数字“3”。

于 2013-10-31T00:03:16.593 回答