JavaScript函数中的默认参数

4

我在这里看到了一些关于此事的问题:

  1. This is good

    function(a, b) {
        a = (typeof a === 'undefined')? 'default_val' : a;
        b = (typeof b === 'undefined')? 'default_val' : b;
    }
    
  2. This is somewhat troublesome (works for anything but boolean values)

    function(a, b) {
        a = a || 'default_val';
        b = b || 'default_val';
    }
    

    If you pass false it break the logic. So this should be marked as a bad habit

  3. There were a few question, but I have never seen the answer to this (nobody answered directly to the question): is this (last method) good (does anyone sees any issues with it) ?

    function(a = 'default_val', b = 'default_val') {
        // your code
    }
    
我已经测试了第三种方法,但没有发现任何问题。我更喜欢最后一种方法。它更加简洁,看起来更像其他语言的结构。
谢谢。

有一个问题:你的第三个语句是无效声明,而且你的函数从未定义。 - Passerby
函数(a = 'default_val',b = 'default_val')存在语法错误。 - Ashwin Prabhu
1
Javascript 不允许为函数参数指定默认值。此外,语法1也不完全有效,因为调用者可以将 undefined 值传递到函数中。您必须检查 arguments.length 来完成这项工作。 - Andrew D.
“因为调用者可以传递未定义的内容,所以检查不完全有效。” 我想是这样。但这是最好的方法(并非完美的方法)。当您不知道会有多少参数时,使用arguments.length不是一个选项。 - Claudiu
@Symba:arguments.length 将被设置为传递的参数数量。因此,在您的情况下,如果它是 0,则两个参数都需要设置为默认值;如果是 1,则第二个参数需要设置为默认值;如果超过 1,则不要分配默认值。这个逻辑可以应用于任意数量的参数。 - slebetman
2个回答

2
在当前ECMAScript实现中,没有像3那样的方法来实现它。我真的很希望也有这种方法。 它是在下一个实现中提出的,被称为“Harmony”,关于它的更多信息在这里: http://wiki.ecmascript.org/doku.php?id=harmony:parameter_default_values 还刚想到我如何实际做到它。通常我把参数作为对象传递,例如,

var options = { x : 20, y : 30 }

然后在函数中这么做。
function iAcceptDefaults(options) {
    var defaults = {
        x: 40 
    }
    var newParameters = $.extend({},options, defaults) // here we using jQuery method extend to mix defaults parameters with options

}

1
你的建议是使用jQuery来为JS添加一些语法糖?在我看来并不是很聪明。 - bjornd
我同意bjornd的观点。使用jQuery方法(或任何其他库)来解决这个问题是不可取的。 - Claudiu
你可以轻松地不使用jQuery来完成它,这只是一个例子,使用Google查找$.extend的替代方案。 - Roman

1
第三个例子在大多数现代浏览器中语法上是不正确的。目前只有在FireFox中才能正常工作(这里有一个已修复的问题),因为这种语法是尚未获得批准的ECMAScript Harmony标准的一部分。

现在已经是2013年了,有什么变化吗? - Games Brainiac
@GamesBrainiac,实际上没有什么改变。仍然只有FireFox支持此功能(http://kangax.github.io/es5-compat-table/es6/)。我认为当标准完成并发布时,大多数ECMAScript Harmony功能将仅被浏览器开发人员采用。JS引擎比CSS引擎更复杂。因此,引入新的实验性功能而不影响性能要困难得多。 - bjornd

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