javascript - 是否可以使用 rest 运算符提供默认参数

标签 javascript ecmascript-6 parameters

我正在学习 ES6 基础类(class)并尝试使用函数的默认参数和剩余运算符。 我已经使用默认参数定义了一个函数 sayHi,然后定义了一个没有提供所需输出的 ​​rest 运算符。

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

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

}

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

上面的代码片段可以正常工作。但是当我尝试为 greetings 变量设置默认参数值时,它有效但给出了不需要的结果,即值 'Ahsan'greetings 获取变量。

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

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

}

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

有没有一种方法可以在 rest 运算符之前像上面那样在函数中设置默认参数?

最佳答案

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

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

您有几个选择:

柯里化(Currying)函数

你可以有一个函数来接受问候语并返回一个函数,这个函数将它与你传递的任何东西一起使用:

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

关于javascript - 是否可以使用 rest 运算符提供默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70184088/

相关文章:

javascript - ES6 Javascript : Calling static methods from classes with arrow functions

javascript - 如果输入为空,我该怎么做,什么都不会发生

javascript - 根据货币获取记录

javascript - 如何从 wikipedia api 获取表数据作为行和列?

javascript - Ember ownsTo 关系在保存时传递为 nil 到服务器

Javascript 集 ES6

java - JAVA中将方法作为参数传递

c# - 如何在 VSTemplate 中创建评估的自定义参数

java - 为什么 int 参数允许传递 char 值,但 char 参数不接受传递 int 值?

javascript - CRM Javascript 自动使用特定字段填充查找值