首页 > 解决方案 > 理解 nodejs 中的解构

问题描述

下面是简单的代码来说明在 nodejs 中使用 let 和解构

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

我根本无法证明分号有什么不同?

标签: node.jsdestructuring

解决方案


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];

并且{a: 12}[3, 4, 5] = [3, 4, 5];实际上会将对象值设置为{a: 12, 3: [3, 4, 5]}

但是此时选项也分配给[3,4,5]


推荐阅读