未捕获到的TypeError:无法解构“未定义”或“空”的属性“名称”

时间:2019-02-18 10:18:29

标签: javascript ecmascript-6 object-destructuring

在传递空对象的情况下,对象分解会引发错误

function test ({name= 'empty'}={}) {
  console.log(name)
}
test(null);

  

未捕获的TypeError:无法解构“未定义”或“空”的属性name。       在测试中(:1:15)       在:1:1

4 个答案:

答案 0 :(得分:0)

请参见docs

  

默认函数参数允许在未传递任何值或未定义的情况下使用默认值初始化命名参数。

换句话说,如果null被传递,默认参数将被分配:

function fn(arg = 'foo') {
  console.log(arg);
}
fn(null);

在函数的第一行解构:

function test (arg) {
  const { name= 'empty' } = arg || {};
  console.log(name)
}
test(null);

答案 1 :(得分:0)

这就是你需要的:

function doDotsCalculations(el) {
    const height = el.height();
    const {top = 'empty', left = 'empty'} = el.position() || {};
    const res = height + top + 20;

    $(".owl-carousel .owl-dots").css({
        top: `${res}px`,
        left: `${left}px`
    });
}

答案 2 :(得分:0)

只需调用不带参数的函数,然后您就会得到预期的(我猜的)行为(名称获得默认值),正如用户@Thank 您在评论中所解释的那样。

positions.forEach((position) => {
    //removes duplicates for a clearer print
    const pos = _.omit(position, [0, 1, 2, 3, 4])
})

答案 3 :(得分:0)

如果您没有任何参数或分配给对象的值,但希望将其传递为空,因为您打算在稍后阶段为其分配一个值,最好将其传递为空,不要将其放在括号内.

假设你有:

这个功能:

const {signup}  = useAuth()

这肯定会引发错误,因为您实际上是在不带参数的情况下传递对象。

要解决此问题,您必须按如下方式从括号中删除空对象:

const signup  = useAuth() 

然后在您的类或函数中使用它,如下所示:

async {....
     await signup(emailRef.current.value, passwordRef.current.value)

...}