Будут ли проблемы если не использовать точку с запятой в javascript?

41
14 июня 2018, 02:10

Был бы рад примеру, если ответ на мой вопрос будет положительным. На данный момент я не видел ни одного случая использования этого знака, где его нельзя было бы просто пропустить. Интерпретатор тоже ни разу не выдавал ошибки из-за отсустствия точки с запятой.

Answer 1

В цикле for нельзя пропустить.

for(объявление переменных; условие; обновление счетчика)

А так же если вы хотите сделать пустое тело цикла:

while(true);
console.log(1) // Без точки с запятой это попадёт в тело цикла

Еще один кейс, при присваивании без точки с запятой в конце можно прихватить что нибудь лишнее, например выражение в скобках может быть понято как вызов функции:

const i = 0 
(2+1).toString();
Или например можно потерять regex:

const i = 0 
/[a-z]/g.exec(i)

или вы хотите сделать массив, а интерпретатор может подумать, что вы хотите достать из конца предыдущей строки какое-то свойство:

console.log(2) 
[1,2].map(num => num*2);

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

Answer 2

В JS есть автоподстановка ;.
Но она может приводить к ошибкам.

Например:

function test () { 
  return {answer: 42}; // (2) Всё ОК 
} 
 
function test2 () { 
  return               // (3) А тут — нет! А разница только в переносе строки 
  {answer: 43};        // А всё из-за того, что автоподставлятор ; поставил конец выражения возврата после перевода строки, выполнил return (без аргумента возвращает undefined), а после него вообще ничего не выполняется 
} 
 
console.info(test(), test2()); // (1) Выводит {answer: 42} undefined. Почему?

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

Answer 3

Проблемы будут в том случае, если новый statement (написанный на новой строке) должен начинаться с одного из следующих символов: [ (массив), ( (скобка), ` (шаблонная строка), / (регулярка), +, - (унарные плюс и минус).

Если точку с запятой принято не ставить, то её обычно добавляют перед этими конструкциями. Другой вариант - добавлять ключевое слово void, правда, он менее универсален.

Answer 4

Когда вы сцепляете куски JavaScript кода для выполнения в функцию eval() вам обязательно надо ставить ; в конце выражения к которому сцепляется другой код. Вот пример

var x = 10, y = 20; 
var res = eval("var z = x * y;"+"z = z + 1") + "<br>";  
document.getElementById("demo").innerHTML = res;
<p id="demo"></p>

Answer 5

При такой формулировке, это вопрос вероятности ошибок при неопределенности условий (исходных данных), и логичный ответ на него: «может будут, а может и нет». Он скорее для гадалок, чем для программистов :)

Если же рассмотреть вопрос с точки зрения норм и правил, а не в формулировке а-ля "когда я вернусь, выйдя из дома?" - обратимся к спецификации ECMAScript:

11.9 Automatic Semicolon Insertion
Most ECMAScript statements and declarations must be terminated with a semicolon. Such semicolons may always appear explicitly in the source text. For convenience, however, such semicolons may be omitted from the source text in certain situations.

То есть, мы можем как ставить точки с запятой, так и надеяться на корректное выполнение кода не проставляя их - но большинство выражений JS должно завершаться ; (интерпретатор "ставит их за нас", когда мы пропускаем).

Таким образом, вопрос сводится к тому, «является ли результат работы алгоритма автоматической вставки ; ожидаемым в абсолютно любых возможных ситуациях?» - и ответ, очевидно: «нет, не является. А значит, проблемы из-за этого возможны».
Подтверждением тому, служит пример из спецификации:

The source

a = b + c
(d + e).print()

is not transformed by automatic semicolon insertion, because the parenthesized expression that begins the second line can be interpreted as an argument list for a function call:

a = b + c(d + e).print()

In the circumstance that an assignment statement must begin with a left parenthesis, it is a good idea for the programmer to provide an explicit semicolon at the end of the preceding statement rather than to rely on automatic semicolon insertion.

p.s.: В качестве вывода, выходящего за рамки вопроса, можно взять выделенное курсивом в последней цитате (то есть, ставить ; не только в случаях подобных примеру, а всюду, где это синтаксически необходимо). Ну, или наоборот... простите за осуждающий тон - подчиниться лени и безответственности: "раз в стандарте написано что так можно, пусть машина дописывает за меня". Тут уж каждый решает сам.

READ ALSO
Почему функция arr.filter не работает?

Почему функция arr.filter не работает?

Нативный начал только учить - примеры брал с MDN

63
Редактор кода на javascript

Редактор кода на javascript

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

59
Замена тега с сохранением содержимого

Замена тега с сохранением содержимого

Как на странице заменить все заголовки h2-h6 на тег div с сохранением всех атрибутов и у которых есть класс title?

50