JavaScript中的函数参数是否支持默认值?

17

当我看到一个与将PHP函数移植到JavaScript相关的问题时,我发现了我认为是错误的JavaScript代码:

function my_isnum(str, negative=false, decimal=false)

然后我在JSFiddle中尝试了这个:

function my_isnum(str, negative=false, decimal=-2)
{
    console.log(arguments);
    console.log(str);
    console.log(negative);
    console.log(decimal);
}
my_isnum("5", "Hi");

令我十分惊讶的是,在Firebug控制台中,我看到了以下内容:

["5", "Hi"]
5
Hi
-2

现在在Chrome中,我看到的是:
Uncaught SyntaxError: Unexpected token = 

这个我不理解的是,这是 Firefox 支持的某个早期标准的例子吗(MDN 上关于 function 的内容似乎没有提到这个)?

我很惊讶火狐(Firefox)也展示了这个! - Popnoodles
Firefox的JavaScript是ECMAScript 3的超集。它具有非标准语法的功能,其中包括数组推导式、let表达式和解构赋值。 - the system
3个回答

18

啊!我就知道。谢谢你提供链接 :) - Jason Sperske
1
糟糕,我的O'Reilly JavaScript:权威指南已经过时了,而我却不知道。 - matt
1
你也可以在Chrome中打开它,方法是启用实验性功能,只需打开一个标签页并在地址栏中键入chrome://flags/即可... 实现可能与Mozilla的不同,就像ECMA6中的新var(又称let)一样。 - Elias Van Ootegem

8

Lostsource的答案是正确的,随着ECMA6的到来,缺省值很可能会得到支持,我认为会这样,但因为它仍然是一个工作草案,所以你不能真正确定...目前,你可以使用逻辑或:

function foo(bar, foobar)
{
    bar = bar || 'foobar';//once
    foobar = foobar || !!bar || true;//or multiple times

这类似于三元运算符。表达式从左到右解析:一旦JS遇到一个真值,就会分配它:

var someVar = false || undefined || null || 0 || 1;

会将数字 1 赋值给变量 someVar。如果函数没有传入参数,所有的参数默认都会被赋值为 undefined,在这种情况下:
myArgument = myArgument || 'default';
//is the same as:
myArgument = undefined || 'default';//evaluates to "default"

但是,当你将falsenull或空字符串作为参数传递时,将会分配默认值,所以要小心。
在这些情况下,if/ternary更适合(如JollySin的答案所示)。它的三元等效形式为:

some_val = typeof some_val === 'undefined' ? 'default' : some_val;

4
有点道理。你可以这样做:

有点像这样:

function the_func(some_val) {
    // if some_val is not passed to the_func 
    if (typeof some_val == 'undefined') {
        some_val = 'default_some_val';
    }

    // now you can use some_val in the remaining parts of the method
}

也许可以少两行。 - Popnoodles
1
这就是我所有代码以及我在JavaScript中看到的每个其他参数检查代码的100%外观。 - Jason Sperske
可以这样做:some_val = (typeof some_val !== 'undefined') ? some_val : 'defaultVal'; - javaBean007
@javaBean007 正确,有更短的方法可以做到这一点。但这是一个初学者问题,所以我选择了最具描述性且最易于阅读的解决方案。 - john_science

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接