簡體   English   中英

具有多個參數的函數中的Javascript默認參數

[英]Javascript default parameters in functions with multiple arguments

我有一個帶有多個可選參數的函數。 目前,該功能沒有以我期望的方式分配默認值。

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);

我不確定這是否值得包括。 情況不會改變。

JavaScript沒有用於命名調用函數時指定的參數的功能,所以這一行:

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

......不會做你認為它做的事情。 它這樣做:

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

例如,函數調用中的arg3 = "notarg1"只是對變量的賦值(在這種情況下,可能是隱式全局 ),賦值運算符的工作方式是它賦值,操作的結果是分配的值。

要使用代碼獲取args 1和2的默認值,您必須指定undefined

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

在那里,你指定ARGS 1和2,但你給他們的價值是falsey,所以你的函數的arg1 = arg1 || "arg1" 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) {
    // ....
}

但是,再一次,在調用它時你所做的是相同的,仍然沒有特殊的“匹配名稱”功能,因為在某些語言中。

更好的方法是將對象傳遞給函數。 這樣你就不必擔心缺少參數了。

var test1 = function(options) {

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM