【问题标题】:understanding destructuring in nodejs理解 nodejs 中的解构
【发布时间】:2020-04-27 02:46:05
【问题描述】:

下面是简单的代码来说明在 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.js destructuring


【解决方案1】:

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

  • 遇到语法不正确的行终止符或“}”时,将插入分号。因此,如果在上一行代码之后立即解析新的一行代码仍然导致 JavaScript 有效,则不会触发 ASI。

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

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

更多详情请参考这篇文章:Semicolons- to use or not to use

在您的情况下,它违反了第一条规则,因为

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

不过此时 options 也分配给[3,4,5]

【讨论】:

    【解决方案2】:

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

    最好在每条语句的末尾使用分号以避免这样的错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      相关资源
      最近更新 更多