Подтвердить что ты не робот

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

Для объектного литерала или объекта jQuery(html, attributes), заявляет ли какая-либо спецификация, что зарезервированные слова или будущие зарезервированные слова ДОЛЖНЫ быть процитированы?

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

Ищете окончательный ответ на этот вопрос, чтобы избежать путаницы.

let objLit = {
  class: 123,
  var: "abc",
  let: 456,
  const: "def",
  import: 789
}

console.dir(objLit);

jQuery("<div>012</div>", {
  class: "ghi"
})
.appendTo("body");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
4b9b3361

Ответ 1

ECMAScript 5 +

Нет, цитаты не нужны с ECMAScript 5. Вот почему:

Как упоминалось в вашем сообщении, из ECMAScript® 5.1 Language Specification:

7.6 Имена и идентификаторы

Идентификационные имена - это токены, которые интерпретируются в соответствии с грамматикой, приведенной в разделе "Идентификаторы" главы 5 стандарта Unicode, с небольшими изменениями. Identifier является IdentifierName, который не является ReservedWord (см. 7.6.1).

[...]

Синтаксис

Identifier ::
  IdentifierName but not ReservedWord

По спецификации a ReservedWord:

7.6.1 Зарезервированные слова

Зарезервированное слово - это IdentifierName, которое нельзя использовать как Identifier.

Синтаксис

ReservedWord :: 
  Keyword
  FutureReservedWord
  NullLiteral
  BooleanLiteral

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

7.6.1.1 Ключевые слова

break    do       instanceof typeof
case     else     new        var
catch    finally  return     void
continue for      switch     while
debugger function this       with
default  if       throw 
delete   in       try   

7.6.1.2 Будущие зарезервированные слова

class enum   extends super
const export import

7.8.1 Null Literals

null

7.8.2 Булевы литералы

true
false

Из сказанного выше (раздел 7.6) следует, что IdentifierName может быть ReservedWord s, а из спецификации инициализаторы объектов:

11.1.5 Инициализатор объектов

[...]

Синтаксис

ObjectLiteral :
  { }
  { PropertyNameAndValueList }
  { PropertyNameAndValueList , }

Где PropertyName есть, по спецификации:

PropertyName :
  IdentifierName
  StringLiteral
  NumericLiteral

Как вы можете видеть, PropertyName может быть IdentifierName, что позволяет ReservedWord быть PropertyName s. Это окончательно говорит нам, что по спецификации разрешено иметь ReservedWord, такие как class и var как PropertyName без кавычек, как строковые литералы или числовые литералы.


ECMAScript < 5

Чтобы более подробно рассказать о том, почему это не было разрешено в предыдущих версиях до ES5, вам нужно посмотреть, как был определен PropertyName. На ECMAScript® 3 Language Specification:

PropertyName :
  Identifier
  StringLiteral
  NumericLiteral

Как вы можете видеть, PropertyName был Identifer - not a IdentifierName, что приводит к невозможности для ReservedWord как PropertyName s.

Ответ 2

Для объектного литерала или объекта jQuery (html, attributes) в любой спецификации указано, что зарезервированные слова или будущие зарезервированные слова ДОЛЖНЫ быть процитированы?

Нет (начиная с ES5).

Определение свойства в spec заключается в том, что это любое имя идентификатора. class - это отличное имя идентификатора.

Как указывали другие комментарии, согласно спецификации, имя свойства в объектном литерале может быть (без кавычек) Идентификатором (в дополнение к строке и т.д.). ИдентификаторName является для всех практических целей любой последовательностью "букв" Unicode, как указано в разделе 7.6.

Обратите внимание, что синтаксическая ошибка, генерируемая

const {class} = obj;

исключение не. Это не объект буквальный, о чем идет речь; это присваивание (или деструктурирующий вид), который пытается назначить переменную class. Конечно, вы не можете, никогда не могли и никогда не сможете иметь переменные, которые названы с зарезервированными словами.

См. также этот пост в блоге, который, хотя и не является авторитетным, является надежным, высококачественным источником информации обо всех вещах ES5/6/7.

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

Что касается "объектов jQuery", "объект jQuery" является обычным старым JS-объектом. Вы имеете в виду элементы DOM , удерживаемые объектами jQuery? Это своего рода гибрид нативных объектов и объектов JS. Как объекты JS, они могут иметь свойства. Однако они не могут быть записаны в объектной литеральной форме, поэтому вопрос на самом деле не применим к ним. (Как родные (DOM) объекты, они могут иметь атрибуты, последний случай не покрывается спецификацией JS.)

Ответ 3

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

В моем коде я предпочитаю Ключи цитирования, например:

var o;

o = {
  "label": "Hello",
  "index": 3
};

Таким образом, проблема странных имен или зарезервированных ключевых слов даже не возникает. Кроме того, все литералы объектов написаны в стиле, который очень близок к действительным JSON, так как добавленная бонусная копия + вставка в отдельный файл JSON (и наоборот) может быть выполнена очень быстро.

Сегодня я считаю это обязательным для чистого кода.