
Споры о том, следует ли включать точки с запятой в их JavaScript, ведутся с тех пор, как в JavaScript была добавлена автоматическая вставка точек с запятой (ASI). Большинство людей попадают в один из двух лагерей:
- тем, кто отказывается использовать точку с запятой в своем JavaScript, или
- те, чья религия вращается вокруг добавления точек с запятой в их JavaScript
Но, к какому бы лагерю вы ни относились, я хотя бы проясню, что именно происходит за кулисами с ASI, и объясню, когда вам нужны точки с запятой, а когда нет.
Итак, давайте сразу проясним: точки с запятой не требуются! Ну, кроме тех случаев, когда они… Может, все-таки не все так однозначно. Давайте разберем это — в JavaScript (и многих других языках программирования, таких как C, C++, Java, C#, и это лишь некоторые из них) символ окончания оператора — точка с запятой. Разработчик может либо вручную вставить точку с запятой в конце оператора, либо полагаться на автоматическую вставку точки с запятой (ASI), которая позволяет опускать точку с запятой, автоматически вставляя ее в определенных ситуациях.
«Для удобства, однако, такие точки с запятой могут быть опущены в исходном тексте в определенных ситуациях. Эти ситуации описываются тем, что в таких ситуациях точка с запятой автоматически вставляется в поток токенов исходного кода».
- Спецификация языка ECMAScript
Проще говоря, если разработчик явно не использует точку с запятой, движок JavaScript будет автоматически вставлять ее в определенных случаях на основе набора правил. Давайте посмотрим на эти правила:
- когда следующая строка начинается с кода, который прерывает текущую (код может появляться на нескольких строках)
- когда следующая строка начинается с
}, закрывая текущий блок - когда достигнут конец файла исходного кода
- когда в отдельной строке есть оператор
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.