Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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 如何处理;空";及;“未定义”;分解函数参数时的值 函数createElement(类型,{attrs={},子类=[]}){ if(Object.prototype.toString.call(参数[1])!=='[Object Object]''){ 抛出错误('选项参数必须是对象'); } 返回{ 类型, 属性, 儿童 } }_Javascript_Destructuring - Fatal编程技术网

Javascript 如何处理;空";及;“未定义”;分解函数参数时的值 函数createElement(类型,{attrs={},子类=[]}){ if(Object.prototype.toString.call(参数[1])!=='[Object Object]''){ 抛出错误('选项参数必须是对象'); } 返回{ 类型, 属性, 儿童 } }

Javascript 如何处理;空";及;“未定义”;分解函数参数时的值 函数createElement(类型,{attrs={},子类=[]}){ if(Object.prototype.toString.call(参数[1])!=='[Object Object]''){ 抛出错误('选项参数必须是对象'); } 返回{ 类型, 属性, 儿童 } },javascript,destructuring,Javascript,Destructuring,我有一个函数,它有两个参数:一个字符串和一个对象。在函数声明中,我通过解构来解压对象的值 当涉及到确保第二个参数是对象时,我知道我可以做这个检查:object.prototype.toString.call(参数[1]!=='object object') 但如果null或undefined作为参数传递,则会发生此错误:Uncaught TypeError:无法对“undefined”或“null”的属性“attrs”进行分解。。这是可以理解的,因为不能将null和undefined强制为对象。

我有一个函数,它有两个参数:一个字符串和一个对象。在函数声明中,我通过解构来解压对象的值

当涉及到确保第二个参数是对象时,我知道我可以做这个检查:
object.prototype.toString.call(参数[1]!=='object object')

但如果
null
undefined
作为参数传递,则会发生此错误:
Uncaught TypeError:无法对“undefined”或“null”的属性“attrs”进行分解。
。这是可以理解的,因为不能将
null
undefined
强制为对象。我能做些什么来防止这种情况

如果将
数组
数字
等作为第二个参数传递,则不会引发错误,因为它们可以被强制,然后我可以在函数体中处理这些值。当处理
null
undefined
时,函数中的代码永远不会执行

//预期行为
createElement('div',[]);//未捕获错误:选项参数必须是对象
createElement('div',function(){});//未捕获错误:选项参数必须是对象
createElement('div',false);//未捕获错误:选项参数必须是对象
createElement('div',new Date());//未捕获错误:选项参数必须是对象
createElement('div',4);//未捕获错误:选项参数必须是对象
//不想要的行为
createElement('div',null);//未捕获的TypeError:无法对“undefined”或“null”的属性“attrs”进行分解
createElement('div',未定义);//未捕获的TypeError:无法对“undefined”或“null”的属性“attrs”进行分解
编辑以提供最终解决方案:在阅读注释后,似乎唯一的解决方案是允许抛出异常,或者对函数体中的代码进行分解并处理错误。这是我选择的解决方案:

createElement(类型,选项){
if(参数[1]!==未定义&&Object.prototype.toString.call(opts)!=='[Object]'){
抛出错误('选项参数必须是对象');
}
const{attrs={},children=[]}=opts | |{};
返回{
类型,
属性,
儿童
}
}
使用默认值

函数createElement(类型,{attrs,children}={}){
返回{
类型,
属性,
儿童
}
}
log(createElement(“foo”);

log(createElement(“foo”,未定义))我建议在函数内部解构,而不是在函数定义中解构

函数createElement(类型,obj){
设{attrs={},children=[]}=obj | |{attrs:undefined,children:undefined}
返回{
类型,
属性,
儿童
}
}

log(createElement('some type',undefined))
您可以推迟解构并提前检查

function createElement (type, object) {
   if (!object || typeof object !== 'object' || Array.isArray(object)) { 
       throw Error('The options argument must be an object'); 
   }
   var { attrs = {}, children = [] } = object;
   return { type, attrs, children };
}

此函数可能满足您的需要(允许默认设置
null
未定义的第二个参数):

此函数还可以修复对象测试以使其正常工作

[更新]

如果希望
null
也抛出非对象错误,可以使用以下方法:

function createElement (type, obj) {
  const arg1 = arguments[1];
  if (arg1 !== undefined &&
      Object.prototype.toString.call(arg1) !== '[object Object]') {
    throw Error('The options argument must be an object'); 
  }
  let { attrs = {}, children = [] } = obj || {}
  return {
    type,
    attrs,
    children
  }
}

请添加一些调用和所需结果的示例。如果要处理错误,为什么不使用Try-catch?完成-感谢您突出显示该错误。@JRK a Try/catch将不起作用,因为在我描述的场景中,函数体中的代码从未执行过。您为什么还要对此加以防范?您希望抛出异常,对吗?如果您将
null
undefined
作为第二个参数传递,您将收到与我收到的相同的错误。
null
是,undefined-no。是的,您是对的。谢谢现在只剩下
null
。为了防止出现
null
,我认为您需要基于代码狂热者的响应,并在检查
if(obj==null)
后在函数体内部进行重构。我不相信有一个巧妙的技巧可以在函数签名中处理它。但也许StackOverflow会证明我是错的。@mbojko你可以这样说,但这就是Hacky在昨晚做了一些研究之后,我也得出了这个结论。但我也很好奇,是否有其他的处理方法。我在研究不同框架使用虚拟dom的方式时遇到了这个函数。我注意到它们都没有这样分解函数参数。也许这就是原因?@CarlMungazi是的,你可以做一些黑客的事情,但最好保持代码干净清晰,这样维护起来就容易了,你可以看到这些谢谢。这个答案让人读起来很有意思,特别是这个老套的答案:
[纬度,经度]=['17.0009','82.2108']是的,我想我会在函数体中进行解构。但是,我尝试了您的解决方案,并注意到阵列仍然通过了检查,这是我不希望它们通过的。我可能会坚持使用
Object.prototype.toString.call(arg1)!='[object object]“
作为我的一站式检查,因为它可以处理所有问题,包括
null
未定义的
。如果您希望
null
也抛出错误,我已经更新了我的答案,以提供一个替代答案。是的,我喜欢这比我确定的最终解决方案更好。
function createElement (type, obj) {
  const arg1 = arguments[1];
  if (arg1 !== undefined &&
      Object.prototype.toString.call(arg1) !== '[object Object]') {
    throw Error('The options argument must be an object'); 
  }
  let { attrs = {}, children = [] } = obj || {}
  return {
    type,
    attrs,
    children
  }
}
In case when object is undefined use {property1,property2}={}

In case when property is undefined use {property1={},property2={}}

In your case object is undefined so below code will be used:

function createElement (type, { attrs = {}, children = [] }={}) {
 if (Object.prototype.toString.call(arguments[1]) !== '[object Object]') { 
   throw Error('The options argument must be an object'); 
 }

 return {
  type,
  attrs,
  children
 }
}