理解nodejs中的析构函数



下面是简单的代码,用于说明在nodejs 中let和destructuring的使用

function main(){
let options = {};
let [r, s, e] = [1, 2, 3];
if(true){
options = {a: 12}
[r, s, e] = [3, 4, 5];
console.log(options, r, s, e);
}
}
main();

输出-[3,4,5]1 2 3

输出很奇怪。应该是{a:12}3 4 5

当我把分号放在第5行的末尾时

options = {a: 12};

我得到正确的输出-{a:12}3 4 5

我根本无法证明分号造成了什么不同?

Javascript在语法实际中断的情况下处理自动分号插入。检查以下条件

  • 当遇到语法不正确的行终止符或"}"时,将插入分号。因此,如果在前一行代码之后解析一行新代码仍然会产生有效的JavaScript,那么ASI将不会被触发。

  • 如果程序到达输入的末尾,并且没有错误,但它不是一个完整的程序,则会在末尾添加分号。这基本上意味着,如果缺少分号,就会在文件末尾添加分号。

  • 语法中的某些地方,如果出现换行符,它会无条件地终止语句,并添加分号。返回语句就是一个例子。

请参阅本文了解更多详细信息:分号-使用或不使用

在你的情况下,它打破了第一条规则,因为

if(true){
options = {a: 12}
[r, s, e] = [3, 4, 5];
console.log(options, r, s, e);
}

将被视为

if(true){
options = {a: 12}[r, s, e] = [3, 4, 5];
console.log(options, r, s, e);
}

它基本上等同于动态对象值参考和分配,如

options = {a: 12}[3, 4, 5] = [3, 4, 5];

并且CCD_ 1将实际使对象值设置为CCD_

然而,此时选项也被分配给[3,4,5]

关于在第5行末尾不使用分号的问题nodejs解析器分配[3,4,5]到选项变量,变量r,s,e保持不变

最好在每条语句的末尾使用分号,以避免出现类似的错误

最新更新