下面是简单的代码,用于说明在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保持不变
最好在每条语句的末尾使用分号,以避免出现类似的错误