【问题标题】:Is it possible to provide default parameters with rest operator是否可以使用 rest 运算符提供默认参数
【发布时间】:2022-01-08 00:54:17
【问题描述】:

我正在学习 ES6 基础课程并尝试函数的默认参数和剩余运算符。 我已经定义了一个函数sayHi,如下所示,带有默认参数,然后是没有给出所需输出的rest运算符。

const sayHi = (greetings, ...names) => {

    names.forEach(item => {
        console.log(`${greetings} ${item}`);
    });

}

sayHi('Hi', 'Ahsan', 'Awais', 'Haseeb');

上面的 sn-p 可以按需要工作。但是当我尝试为greetings 变量设置默认参数值时,它可以工作,但会给出不需要的结果,即'Ahsan' 的值被greetings 变量采用。

const sayHi = (greetings = ' Hi', ...names) => {

  names.forEach(item => {
    console.log(`${greetings} ${item}`);
  });

}

sayHi('Ahsan', 'Awais', 'Haseeb');

有没有办法在休息运算符之前像上面一样在函数中设置默认参数?

【问题讨论】:

    标签: javascript ecmascript-6 parameters


    【解决方案1】:

    你不能,不。剩余参数仅获取未被任何先前形式参数消耗的参数的“剩余”参数,因此greeting 将始终接收第一个参数的值。

    另外,由于名称和问候语具有相同的类型,因此如果您想以这种方式接受名称,则根本无法提供默认值。

    几个选项供您选择:

    柯里化函数

    你可以有一个函数来接受问候并返回一个函数,该函数与你传递的任何内容一起使用:

    const greet = (greeting = "Hi") => (...names) => {
        for (const name of names) {
            console.log(`${greeting} ${name}`);
        }
    };
    
    greet()("Ahsan", "Awais", "Haseeb");
    greet("Hello")("Ahsan", "Awais", "Haseeb");

    注意我们如何称呼它:

    greet()("Ahsan", "Awais", "Haseeb");
    

    greet() 使用默认问候语创建函数。然后我们通过在其上使用("Ahsan", "Awais", "Haseeb") 来调用该函数。 greet("Hello") 创建一个使用问候 "Hello" 的函数(然后我们调用它)。

    (我也冒昧地使用for..of 而不是forEach,但这是风格问题。)

    把名字当作数组

    另一种选择是将名称作为数组接受。这样,我们就可以在函数内部判断我们是否收到了问候:

    const greet = (greeting, names) => {
        if (Array.isArray(greeting)) {
            names = greeting;
            greeting = "Hi";
        }
        for (const name of names) {
            console.log(`${greeting} ${name}`);
        }
    };
    
    greet(["Ahsan", "Awais", "Haseeb"]);
    greet("Hello", ["Ahsan", "Awais", "Haseeb"]);

    【讨论】:

    • 第一种选择似乎更干净。 + 1
    【解决方案2】:

    您只需在第一个参数中传递 undefined 即可跳过可选参数
    像这样想greetings = typeof greetings != 'undefined' ? greetings : "hi" 这意味着检查greetings 的值,如果它未定义(未提供)使用默认值
    编辑:这里是代码 sn-p

    const sayHi = (greetings = ' Hi', ...names) => {
    
      names.forEach(item => {
        console.log(`${greetings} ${item}`);
      });
    
    }
    
    sayHi(undefined, 'Ahsan', 'Awais', 'Haseeb');
    

    【讨论】:

    • 好点,你可以这样做,虽然它会很笨重。答案将受益于更多的解释,也许还有一个例子。 (调用者也很容易出错。)
    • 我刚刚编辑了答案
    • 但是如果希望提供“Greeting”、“Hello”或“Bonjour”作为值怎么办。我认为这在这种情况下行不通。
    • @Ahsan - 会的。默认情况下,您需要sayHi(undefined, "Ahsan", "Awais", "Haseeb"),这同样很容易出错。对于"Hello",它将是sayHi("Hello", "Ahsan", "Awais", "Haseeb")
    • 是的,你可以在这里:js sayHi(undefined, 'Ahsan', 'Awais', 'Haseeb') // def sayHi('Bonjour', 'Ahsan', 'Awais', 'Haseeb') // customized 这就是你的意思吗??
    猜你喜欢
    • 2018-04-28
    • 2014-11-03
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 2021-10-26
    • 2022-11-10
    相关资源
    最近更新 更多