Споры о том, следует ли включать точки с запятой в их JavaScript, ведутся с тех пор, как в JavaScript была добавлена ​​​​автоматическая вставка точек с запятой (ASI). Большинство людей попадают в один из двух лагерей:

  • тем, кто отказывается использовать точку с запятой в своем JavaScript, или
  • те, чья религия вращается вокруг добавления точек с запятой в их JavaScript

Но, к какому бы лагерю вы ни относились, я хотя бы проясню, что именно происходит за кулисами с ASI, и объясню, когда вам нужны точки с запятой, а когда нет.

Итак, давайте сразу проясним: точки с запятой не требуются! Ну, кроме тех случаев, когда они… Может, все-таки не все так однозначно. Давайте разберем это — в JavaScript (и многих других языках программирования, таких как C, C++, Java, C#, и это лишь некоторые из них) символ окончания оператора — точка с запятой. Разработчик может либо вручную вставить точку с запятой в конце оператора, либо полагаться на автоматическую вставку точки с запятой (ASI), которая позволяет опускать точку с запятой, автоматически вставляя ее в определенных ситуациях.

«Для удобства, однако, такие точки с запятой могут быть опущены в исходном тексте в определенных ситуациях. Эти ситуации описываются тем, что в таких ситуациях точка с запятой автоматически вставляется в поток токенов исходного кода».

- Спецификация языка ECMAScript

Проще говоря, если разработчик явно не использует точку с запятой, движок JavaScript будет автоматически вставлять ее в определенных случаях на основе набора правил. Давайте посмотрим на эти правила:

  1. когда следующая строка начинается с кода, который прерывает текущую (код может появляться на нескольких строках)
  2. когда следующая строка начинается с }, закрывая текущий блок
  3. когда достигнут конец файла исходного кода
  4. когда в отдельной строке есть оператор return, break, throw или continue

Основываясь на этих правилах, давайте посмотрим на код и посмотрим, сможем ли мы предсказать, что произойдет:

const a = 1
const b = 2
const c = a + b
(a + b).toString()

Вы можете подумать, что это вернет "3", но вы ошибетесь! Вместо этого мы получаем ошибку TypeError: b is not a function, потому что на основе правила 1 JavaScript пытается интерпретировать код как:

const a = 1
const b = 2
const c = a + b(a + b).toString()

Другой пример на основе правила 4:

(() => {
  return
  {
    name: 'fred'
  }
})()

Вы ожидаете, что возвращаемое значение этой немедленно вызванной функции будет объектом, содержащим свойство name, но это не так. Вместо этого это undefined, потому что JavaScript вставляет точку с запятой после return. Вместо этого вы должны поставить открывающую скобку сразу после return:

(() => {
  return {
    name: 'fred'
  }
})()

В заключение, как у разработчиков, у нас есть выбор: явно вставлять точки с запятой или полагаться на ASI, чтобы вставить их за нас во время синтаксического анализа. Выбор, в конечном счете, остается за нами, и пока мы знаем о правилах ASI, у нас не должно возникнуть проблем с их исключением из нашего кода. Я предпочитаю опускать точки с запятой в своем коде, но теперь, когда вы точно понимаете, что происходит, вы можете принять взвешенное решение и чувствовать себя уверенно в будущем как разработчик JavaScript, с точкой с запятой или без нее.

Это сообщение написано студентом-разработчиком Power Code Academy.