Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ES6对象分解强制参数_Javascript_Ecmascript 6 - Fatal编程技术网

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