Нужны ли точки с запятой после назначения объектного литерала в JavaScript?

Следующий код иллюстрирует назначаемый литерал объекта, но без точки с запятой впоследствии:

var literal = {
    say: function(msg) { alert(msg); }
}
literal.say("hello world!");

Это, похоже, является законным и не выдает предупреждение (по крайней мере, в Firefox 3). Является ли это полностью законным или существует строгая версия JavaScript, где это не разрешено?

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

Ответ 1

Не технически, JavaScript имеет точки с запятой как необязательные во многих ситуациях.

Но, как правило, используйте их в конце любого оператора. Зачем? Потому что, если вы когда-либо захотите сжать script, это спасет вас от бесчисленных часов разочарования.

Автоматическая вставка точки с запятой выполняется интерпретатором, поэтому вы можете оставить их, если вы этого захотите. В комментариях кто-то утверждал, что

Точки с запятой не являются необязательными с такими операциями, как break/continue/throw

но это неверно. Они не являются обязательными; что действительно происходит, так это то, что терминаторы линии влияют на автоматическую вставку с запятой; это тонкая разница.

Ниже приведена остальная часть стандарта вставки с запятой:

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

Ответ 2

Компрессор YUI и dojo shrinksafe должны отлично работать без точек с запятой, поскольку они основаны на полном парсе JavaScript. Но Packer и JSMin не будут.

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

var literal = {
    say: function(msg) { alert(msg); }
}
(function() {
    // ....
})();

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

Ответ 3

Устные переводчики JavaScript делают что-то, называемое "вставка с запятой", поэтому, если строка без точки с запятой действительна, точка с запятой будет тихо добавлена ​​в конец инструкции, и ошибка не будет.

var foo = 'bar'
// Valid, foo now contains 'bar'
var bas =
    { prop: 'yay!' }
// Valid, bas now contains object with property 'prop' containing 'yay!'
var zeb =
switch (zeb) {
  ...
// Invalid, because the lines following 'var zeb =' aren't an assignable value

Не слишком сложно и по крайней мере ошибка бросается, когда что-то явно не так. Но бывают случаи, когда ошибка не возникает, но операторы не выполняются по назначению из-за вставки точки с запятой. Рассмотрим функцию, которая должна возвращать объект:

return {
    prop: 'yay!'
}
// The object literal gets returned as expected and all is well
return
{
    prop: 'nay!'
}
// Oops! return by itself is a perfectly valid statement, so a semicolon
// is inserted and undefined is unexpectedly returned, rather than the object
// literal. Note that no error occurred.

Ошибки, подобные этому, могут быть безумно трудными для поиска, и, хотя вы не можете гарантировать, что это никогда не произойдет (поскольку я не знаю, как отключить вставки с запятой), эти виды ошибок легче идентифицировать, когда вы делаете свой намерения ясны, последовательно используя точки с запятой. Это и явно добавление точек с запятой обычно считается хорошим стилем.

Мне впервые сообщили об этой коварной маленькой возможности, когда читайте превосходную и лаконичную книгу Дугласа Крокфорда " JavaScript: Хорошие части". Я очень рекомендую его.

Ответ 4

В этом случае нет необходимости в точке с запятой в конце инструкции. Вывод один и тот же, но аргументация - это выход.

JavaScript не имеет точек с запятой как "необязательный". Скорее, он имеет строгие правила вокруг автоматической точки с запятой. Точки с запятой не являются необязательными с такими выражениями, как break, continue или throw. Подробнее см. Спецификация языка ECMA; в частности 11.9.1, правила автоматической точки с запятой.

Ответ 5

Используйте JSLint, чтобы ваш JavaScript был чистым и аккуратным

JSLint говорит:

Ошибка:

Предполагаемое глобальное: предупреждение 2

Проблема с символом строки 3: Отсутствует точка с запятой.

}

Ответ 6

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

Если вы хотите написать "правильный" JavaScript, я бы предложил проверить вещи в Firefox с javascript.options.strict (доступ через about:config), установленным в true. Он может не поймать все, но он должен помочь вам убедиться, что ваш код JavaScript более совместим.

Ответ 7

Это недопустимо (см. пояснение ниже) код JavaScript, так как назначение - это просто регулярный оператор, отличный от

var foo = "bar";

Точка с запятой может быть опущена, поскольку интерпретаторы JavaScript пытаются добавить точку с запятой для исправления ошибок синтаксиса, но это дополнительный и ненужный шаг. Я не знаю строгий режим, но я знаю, что автоматические парсеры или компрессоры/обфускаторы нуждаются в этой точке с запятой.

Если вы хотите написать правильный код JavaScript, напишите точку с запятой: -)

В соответствии с спецификацией ECMAscript http://www.ecma-international.org/publications/standards/Ecma-262.htm точки с запятой автоматически вставлены, если они отсутствуют. Это делает их не требуемыми для автора script, но это подразумевает, что они необходимы для интерпретатора. Это означает, что ответ на исходный вопрос "Нет", они не требуются при написании script, но, как указано другими, рекомендуется по разным причинам.