以下是该功能,password
是强制性的,但其他id
和name
具有默认值:
function name({id = null, name = 'user', password}) { }
结果:
name(); //throws error as expected
name({}); //passes 'password' as 'undefined' - should've thrown error
如果使用ES6功能未提供password
,如何使此功能抛出错误?
答案 0 :(得分:4)
您可以分配相同的变量,如果没有给出,则会抛出错误Use before declaration
。
function name({ id = null, name = 'user', password = password }) {
console.log(password);
}
name({});
如果设置,那么它可以正常工作。
function name({ id = null, name = 'user', password = password }) {
console.log(password);
}
name({ password: 'foo' });
答案 1 :(得分:2)
您没有要求它,您根本没有提供默认值。
function name({id = null, name = 'user', password}) {
if (password == undefined) {
throw new Error('password is required');
}
它第一次抛出错误的原因是因为它试图破坏undefined
,这是不可能的。
答案 2 :(得分:2)
注意:这是一个使用默认参数的丑陋黑客,我更喜欢@Scimonster's answer。
您实际上可以运行一个函数,甚至可以将IIFE作为默认参数。 IIFE可能会抛出错误:
function name({
id = null,
name = 'user',
password = (() => { throw new Error('password not defined'); })()
}) {
console.log(id, name, password);
}
name({ id: 1, name: 'the name', password: 'the password' }); // works
name({}); // throws an error

答案 3 :(得分:1)
Scimonster's answer是正确的。
如果您愿意,可以使用实用程序函数在函数参数列表中抛出Error
,以声明方式处理它:
// Utility function:
function throwRequired(name) {
throw new Error(`'${name}' is required`);
}
function name({id = null, name = 'user', password = throwRequired("password")}) {
console.log("All is good, password is: " + password);
}
try {
name(); //throws error as expected
} catch (e) {
console.log("Got error from name():", e.message);
}
try {
name({}); //throws error as expected
} catch (e) {
console.log("Got error from name({}):", e.message);
}
name({password: "foo"}); // works
这是有效的,因为只有在需要填写默认参数时,才会评估默认参数的初始值设定项。