具有多个参数的函数中的Javascript默认参数

时间:2015-11-14 12:28:25

标签: javascript function default

我有一个带有多个可选参数的函数。目前,该功能并未以我期望的方式分配默认值。

var test1 = function(arg1, arg2, arg3, arg4) {

    arg1 = arg1 || "arg1";
    arg2 = arg2 || "arg2";

    var obj = {
      arg1: arg1,
      arg2: arg2,
      arg3: arg3,
      arg4: arg4
    };

    return(obj);

};

var obj1 = test1(arg3 = "notarg1", arg4 = "notarg2"); // Why are these values assigned to arg1 & arg2 instead of 3 & 4?

console.log(obj1);

我不明白这一点。 Javascript似乎忽略了我的(arg3 = "notarg1", arg4 = "notarg2")分配,而是表现为(arg1 = "notarg1", arg2 = "notarg2", arg3 = undefined, arg4 = undefined)是我的输入。

  var test2 = function(arg1, arg2, arg3, arg4) {

    if (arg1 === null) {
      arg1 = "arg1";
    }
    if (arg2 === null || arg2 === "undefined") {
      arg2 = "arg2";
    }

    var obj = {
      arg1: arg1,
      arg2: arg2,
      arg3: arg3,
      arg4: arg4
    };

    return(obj);

  };

  var obj2 = test2(arg3 = "notarg1", arg4 = "notarg2")

  console.log(obj2);

我不确定这是否值得包括。情况并没有改变。

2 个答案:

答案 0 :(得分:10)

调用函数时,JavaScript没有用于命名您指定的参数的功能,所以这一行:

var obj1 = test1(arg3 = "notarg1", arg4 = "notarg2");

......没有按照你的想法去做。它这样做:

arg3 = "notarg1";
arg4 = "notarg2";
var obj1 = test1("notarg1", "notarg2");

例如,函数调用中的arg3 = "notarg1"只是对变量的赋值(在本例中,可能是implicit global),赋值运算符的工作方式是赋值和操作的结果是指定的值。

要使用您的代码获取args 1和2的默认值,您必须指定undefined

var obj1 = test1(undefined, undefined, arg3, arg4);

在那里,你指定args 1和2,但你给它们的值是假的,所以你的函数arg1 = arg1 || "arg1""arg1"(和类似的对于arg2)。

如果你有超过三个参数,你可能会改为使用选项对象:

function test1(options) {
    var arg1 = options.arg1 || "arg1";
    var arg2 = options.arg2 || "arg2";
    var arg3 = options.arg3 || "arg3";
    var arg4 = options.arg4 || "arg4";

    console.log(arg1, arg2, arg3, arg4)
}

test({arg3: "notarg1", arg4: "notarg2"});

输出:

arg1, arg2, notarg1, notarg2

为了完整起见,ES2015(又名ES6)添加了默认参数值,但您仍然无法按照您在问题中显示的方式调用函数。但是,ES2015语法确实简化了函数中的代码。

// ES2015+
function test1(arg1 = "arg1", arg2 = "arg2", arg3, arg4) {
    // ....
}

但是,再次,调用时所做的事情是相同的,仍然没有像某些语言那样特殊的“匹配名称”功能。

答案 1 :(得分:1)

更好的方法是将对象传递给函数。这样你就不用担心缺少参数了。

var test1 = function(options) {

    var arg1 = options.arg1 || "arg1";
    var arg2 = options.arg2 || "arg2";
    ...
};

var obj1 = test1({ arg1: "notarg3", arg2: "notarg1" });