JavaScript解构console.log导致错误

时间:2018-12-08 16:21:19

标签: javascript arrays

我试图用递归方法解构数组。下面是一个简单的示例。一切都很好。

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)
 }

未捕获的TypeError:无法设置未定义的属性“ 99”

问题没有解决。我只想了解并知道是什么原因造成的。我已经搜索了一段时间,老实说,我还不知道。

1 个答案:

答案 0 :(得分:0)

您省略了分号

请参见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)

需要在赋值完成之前对右侧进行评估,并且由于它具有递归调用,因此只有在终止情况之后才进行第一次赋值(在下一个<100评估为false之后)

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

undefined[99] = [0, 100]