是否可以使用 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');
我正在学习 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');