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

Is it possible to provide default parameters with rest operator

我正在学习 ES6 基础课程并尝试函数的默认参数和剩余运算符。 我用默认参数定义了一个函数 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 将始终接收第一个参数的值。

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

您有几个选择:

柯里化函数

您可以有一个接受问候语的函数和 returns 一个可以将它与您传递的任何内容一起使用的函数:

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

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

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

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

}

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