JS:函数参数默认值

时间:2011-01-22 23:30:25

标签: javascript function arguments

在某些语言中,您可以为函数的参数设置默认值:

function Foo(arg1 = 50, arg2 = 'default') {
    //...
}

你是如何用JavaScript做的?

4 个答案:

答案 0 :(得分:16)

在JavaScript中,未设置的任何内容都会被赋予值undefined。这意味着如果要为函数设置默认值,则需要检查第一行以查看是否未定义这些值:

function Foo(arg1, arg2) {
    if (typeof(arg1) === "undefined") { arg1 = 50; }
    if (typeof(arg2) === "undefined") { arg2 = "default"; }
}

如果你大致知道这些数值是什么,你可以采取一些捷径:

function Foo(arg1, arg2) {
    arg1 = arg1 || 50;
    arg2 = arg2 || "default";
}

然而,如果这些论点是假的,它们将被替换。这意味着如果arg1是一个空字符串,nullundefinedfalse0它将被更改为50,所以如果您选择使用它,请务必小心

答案 1 :(得分:5)

我更喜欢== null检查而不是typeof(arg1) === undefined(因为jQuery库在内部执行:http://docs.jquery.com/JQuery_Core_Style_Guidelines#JSLint)。它不仅更简洁,还处理null和undefined,因此客户端代码可以传入null并获得默认值。

也可以将该函数包装在另一个提供默认值的函数中。 prototypejs库有一个提供argumentNames()的函数(或者如果你不想使用原型,你可以借用实现 - 它只是一个应用于函数toString()结果的正则表达式)。

所以你可以这样做:

var Foo = defaults(Foo, { arg1: 50, arg2: 'default' });
function Foo(arg1, arg2) {
  //...
}

defaults()的实现看起来像这样:

function defaults(fn, def) {
  return function() {
    var arg_names = fn.argumentNames();
    var nArgs = args.length;
    for (var nArg = 0; nArg < nArgs; ++nArg) {
      if (arguments[nArg] == null && arg_names[nArg] in def)
        arguments[nArg] = def[arg_names[nArg]];
    }
    fn.apply(this, arguments);
  }
}

当然,这是未经测试的代码及其编写方式,它需要Prototype库。但是所有这一切,函数内部的== null方法对于Javascript来说更自然,更容易调试(你没有其他功能层可以逐步完成),我觉得它更容易阅读:

function Foo(arg1, arg2) {
  if (arg1 == null) arg1 = 50;
  if (arg2 == null) arg2 = 'default';
}

答案 2 :(得分:1)

您必须在函数体中执行此操作:

function Foo(arg1 ,arg2) {
    if( typeof arg1 === 'undefined' )
        arg1 = 50;

    if( typeof arg2 === 'undefined' )
        arg2 = 'default';
    //...
}

另一种为undefinednull测试它们的方法是这样的:

function Foo(arg1 ,arg2) {
    if( arg1 == undefined )
        arg1 = 50;

    if( arg2 == undefined )
        arg2 = 'default';
    //...
}

有些人不喜欢它,因为它可以覆盖undefined的值,因为它只是一个全局属性。只要它没有被覆盖,这将工作正常。如果参数为nullundefined,则会将其设置为默认值。

答案 3 :(得分:1)

从ES2015(ES6)开始,默认参数可以这样设置:

function multiply (a, b = 2) {
  return a * b;
}
multiply(5); // 10