我正在学习 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/