首页 > 解决方案 > Javascript解构console.log导致错误

问题描述

我试图以递归方法解构数组。下面是一个简单的例子。一切正常。

function createNode(index, node) {
    let next = node+ 1
    if (next < 100) {
        for (let i=0; i < 5; i++) {
            [index, next] = createNode(index, next)
        }
    }
    return [index, next]
}
createNode(0, 0)

但是,当我将 console.log 添加到 for 循环时,它会崩溃。

 for (let i=0; i < 5; i++) {
     console.log(next)
     [index, next] = createNode(index, next)
 }

未捕获的类型错误:无法设置未定义的属性“99”

问题不在于解决它。我只是想了解并知道是什么原因造成的。我一直在寻找一段时间,老实说,我还不知道。

标签: javascriptarrays

解决方案


你省略了分号

https://stackoverflow.com/a/2846298/4023734

这是您的代码无法正常工作的主要原因。通常你可以侥幸逃脱,因为 JavaScript 会自动为你插入分号。

但是在这种情况下,该句子后面跟着另一个以字符 [ 开头的句子

所以,

console.log(next)
[index, next] = createNode(index, next)

实际上是一样的

console.log(next)[index, next] = createNode(index, next)

并且 javascript 将评估console.log(next)(返回未定义)然后尝试获取[index, next]它。因为 [] 中的表达式index, next是一个逗号分隔的表达式,它的计算结果是最后一个表达式,所以它实际上与刚才相同next

错误提到 99 的原因是因为在评估时:

console.log(next)[index, next] = createNode(index, next)

右侧需要在赋值完成之前进行评估,因为它有一个递归调用,所以只有在终端情况之后才会完成第一个赋值(在 next < 100 评估为 false 之后)

因此,当它出错时,它会尝试评估:

undefined[99] = [0, 100]

推荐阅读