понимание разрушения в nodejs - PullRequest
0 голосов
/ 26 апреля 2020

Ниже приведен простой код, иллюстрирующий использование let и деструктурирования в nodejs

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();

output - [3, 4, 5] 1 2 3

Вывод странный. Это должно быть {a: 12} 3 4 5

когда я ставлю точку с запятой в конце строки 5

options = {a: 12};

я получаю правильный вывод - {a: 12} 3 4 5

Я просто не могу объяснить, какая разница от точки с запятой?

Ответы [ 2 ]

2 голосов
/ 26 апреля 2020

Javascript обрабатывает Automati c Вставка точек с запятой в тех случаях, когда ваш синтаксис фактически нарушается. Проверяются следующие условия

  • Точка с запятой будет вставлена, когда она встретится с ограничителем строки, или '}', который не является грамматически правильным. Таким образом, если синтаксический анализ новой строки кода сразу после предыдущей строки кода все еще приводит к действительному значению JavaScript, ASI не будет запущен.

  • Если программа завершает работу на входе и ошибок не было, но это не полная программа, точка с запятой будет добавлена ​​в конец. Что в основном означает, что точка с запятой будет добавлена ​​в конец файла, если она отсутствует.

  • В грамматике есть определенные места, где, если появляется разрыв строки, он завершает оператор безусловно, и это добавит точку с запятой. Одним из примеров этого являются операторы return.

Пожалуйста, обратитесь к этой статье для более подробной информации: Точки с запятой - использовать или не использовать

В вашем если это нарушает первое правило, потому что

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

, что в основном эквивалентно динамической c ссылке на объектное значение и присваиванию, например

 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]

0 голосов
/ 26 апреля 2020

при отсутствии точки с запятой в конце строки 5 nodejs синтаксический анализатор, назначающий [3, 4, 5] переменной и переменной r, s, e, остается неизменным

Рекомендуется использовать точку с запятой при конец каждого оператора, чтобы избежать ошибки, подобной этой

...