奇怪的JavaScript行为

时间:2013-10-30 23:54:19

标签: javascript function return-value

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

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

为什么会这样?

3 个答案:

答案 0 :(得分:6)

这并不奇怪。您将返回3,它将被推送到数组中,因此.push()方法返回新的长度,即1

如果您不记录.push()来电,只记录foo()来电,那么您只是看到了返回的3

要清楚,当你这样做时:

return 1,2,3;

你要返回最后一个逗号运算符的结果,这是最后一个表达式,3


如果您希望将所有值都推送到Array中,则需要返回一个值数组,因为JavaScript只允许一个返回值。

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

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

因为我使用.apply()来调用.push(),所以它将返回的数组的成员作为单独的参数传递。

答案 1 :(得分:3)

The value of a list of expressions separated by , is the value of the last expression.因此,

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

相当于

function foo(){ return 3; }

至于为什么[].push(foo())会返回3,只需阅读some Array.push() documentation,这应该是显而易见的:push会返回数组的新长度。

答案 2 :(得分:1)

问题1 返回“1,2,3”不是在javascript中返回多个值的正确语法。您的语法似乎最终将最后一个数字“3”作为返回值。

var test = foo()
typeof test
"number"

请参阅此处了解传递多个数据的正确方法:Return multiple values in JavaScript?

问题2

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

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