Javascript ES6对象分解强制参数
这是一个函数,Javascript ES6对象分解强制参数,javascript,ecmascript-6,Javascript,Ecmascript 6,这是一个函数,密码是必需的,但其他id和名称具有默认值: function name({id = null, name = 'user', password}) { } 结果: name(); //throws error as expected name({}); //passes 'password' as 'undefined' - should've thrown error 如果使用ES6功能未提供密码,如何使此函数抛出错误?您没有要求它,只是没有提供默认值 funct
密码
是必需的,但其他id
和名称
具有默认值:
function name({id = null, name = 'user', password}) { }
结果:
name(); //throws error as expected
name({}); //passes 'password' as 'undefined' - should've thrown error
如果使用ES6功能未提供密码,如何使此函数抛出错误?您没有要求它,只是没有提供默认值
function name({id = null, name = 'user', password}) {
if (password == undefined) {
throw new Error('password is required');
}
它第一次抛出错误的原因是它试图对未定义的
进行分解,这是不可能的。您没有要求它,只是没有提供默认值
function name({id = null, name = 'user', password}) {
if (password == undefined) {
throw new Error('password is required');
}
它第一次抛出错误的原因是因为它试图对未定义的进行解构,这是不可能的。您可以指定相同的变量,如果未指定,它将抛出错误在声明之前使用
函数名({id=null,name='user',password=password}){
console.log(密码);
}
名称({})代码>您可以指定相同的变量,如果未指定,则会抛出一个错误在声明之前使用
函数名({id=null,name='user',password=password}){
console.log(密码);
}
名称({})代码>准确地说明了问题所在
如果愿意,您可以使用实用程序函数在函数参数列表中抛出错误
,以更声明的方式处理它:
//实用程序函数:
需要的函数(名称){
抛出新错误(“${name}”是必需的“);
}
函数名({id=null,name='user',password=throwRequired(“password”)}){
console.log(“一切正常,密码为:“+密码”);
}
试一试{
name();//按预期抛出错误
}捕获(e){
log(“从name():”中获取错误,e.message);
}
试一试{
name({});//按预期抛出错误
}捕获(e){
log(“从名称({})中获取错误):”,e.message);
}
名称({密码:“foo”});//works
非常了解问题所在
如果愿意,您可以使用实用程序函数在函数参数列表中抛出错误
,以更声明的方式处理它:
//实用程序函数:
需要的函数(名称){
抛出新错误(“${name}”是必需的“);
}
函数名({id=null,name='user',password=throwRequired(“password”)}){
console.log(“一切正常,密码为:“+密码”);
}
试一试{
name();//按预期抛出错误
}捕获(e){
log(“从name():”中获取错误,e.message);
}
试一试{
name({});//按预期抛出错误
}捕获(e){
log(“从名称({})中获取错误):”,e.message);
}
名称({密码:“foo”});//工作
注意:这是一个使用默认参数的丑陋的破解,我更喜欢
实际上,您可以将函数甚至IIFE作为默认参数运行。IIFE可能会抛出一个错误:
函数名({
id=null,
名称='用户',
密码=(()=>{抛出新错误('未定义密码');}()
}) {
控制台日志(id、名称、密码);
}
名称({id:1,名称:'名称',密码:'密码'});//作品
名称({});//抛出一个错误
注意:这是一个使用默认参数的丑陋的攻击,我更喜欢
实际上,您可以将函数甚至IIFE作为默认参数运行。IIFE可能会抛出一个错误:
函数名({
id=null,
名称='用户',
密码=(()=>{抛出新错误('未定义密码');}()
}) {
控制台日志(id、名称、密码);
}
名称({id:1,名称:'名称',密码:'密码'});//作品
名称({});//抛出一个错误
我知道可以使用ES5或传统javascript代码来实现,但是否存在这样的问题?我不必编写额外的验证并使用ES6功能
,就像usecase 1
?不,是“验证”这只是解构的一个副作用。我知道可以使用ES5或传统javascript代码来实现,但我是否不必编写额外的验证并使用ES6功能
,就像usecase 1
?不,是“验证”这篇文章也值得一读:为什么,password=password}
不同于,password}
?因为它是一个默认赋值,带有一个不存在的变量。如果存在,则不会发生赋值。默认赋值也是未定义的
,为什么未定义的
不等于未定义的变量
?我希望我清楚,这个未定义的
地狱让我困惑。变量密码
不存在。即使RHS更改为。
,它也不存在。它没有定义,因此会抛出一个错误。本文还值得一读:为什么,password=password}
与,password}
不同?因为它是一个默认赋值,带有一个不存在的变量。如果存在,则不会发生赋值。默认赋值也是未定义的
,为什么未定义的
不等于未定义的变量
?我希望我清楚,这个未定义的
地狱让我困惑。变量密码
不存在。即使RHS更改为。
,它也不存在。它没有定义,因此会抛出一个错误。(Doh!如果上面没有看到throwRequired
,请点击刷新。)(Doh!如果上面没有看到throwRequired
,请点击刷新。)为什么不验证函数本身中的传入参数并在任何无效的情况下抛出?检查一个空字符串或甚至一个非字符串可以传递一个密码,这将传递任何自动的ES6内容,因此您将不得不验证密码字段。即使您有一种硬类型的语言,您仍然需要验证。@jfriend00我同意,但我只想为那些只需要关心未定义的
的场景保存代码。它只是mcve