Почему некоторые объектно-литературные свойства цитируются, а другие нет?

Я все время вижу это: литералы объектов объявляются такими, что некоторые ключи окружены кавычками, а другие - нет. Пример из jQuery 1.4.2:

jQuery.props = {
    "for": "htmlFor",
    "class": "className",
    readonly: "readOnly",
    maxlength: "maxLength",
    cellspacing: "cellSpacing",
    rowspan: "rowSpan",
    colspan: "colSpan",
    tabindex: "tabIndex",
    usemap: "useMap",
    frameborder: "frameBorder"
};

Каково значение обертывания первых двух ключей свойств ( for и class ) кавычками, а остальные - без цитат? Существуют ли какие-либо различия?

Я прокрутил спецификацию ECMAScript 5; все, что я смог найти, - это [Примечание 6 раздела 15.12.3, акцент мой]:

ПРИМЕЧАНИЕ 6 Объект отображается как открытие левой скобки с последующим нулем или больше свойств, разделенных запятыми, закрытыми с правой скобой. свойство - цитированная строка представляя ключ или имя свойства, толстой кишки, а затем стоимость имущества. Массив отображается в качестве открытой левой скобки, за которой следует ноль или более значений, разделенных запятыми, закрытыми правой скобкой.

Однако это относится только к строковому расширению JSON.

Ответ 1

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

Строго говоря, чистая запись "JSON" требует, чтобы все "ключевые" строки были процитированы. Однако сам Javascript в порядке с ключами, которые являются достоверными идентификаторами (но не зарезервированными словами), которые не кавычки.

Ответ 2

На этом этапе (два плюс несколько лет) есть причина, чтобы процитировать свойства объектного литерала. Если вы хотите минимизировать свой код с помощью компилятора Closure, им может потребоваться сделать свойства доступными для других исходных файлов. В этом случае они захотят избежать переименования символов компилятором. При цитировании имени свойства компилятор Closure не будет минимизировать (переименовывать) их.

Смотрите: Удаление кода, который вы хотите сохранить

(Это относится как минимум к настройке ADVANCED_OPTIMIZATIONS.)

Ответ 3

Ключевые слова языка Java или зарезервированные ключевые слова всегда окружены кавычками.

Ответ 4

for и class являются языковыми ключевыми словами. Ваш интерпретатор будет бросать SyntaxError, если они не кавычки.

См. раздел 7.6.1.1 в спецификации, с которой вы связаны.

Ответ 5

Javascript содержит много зарезервированных слов, которые на самом деле не используются языком, который, как мне кажется, был зарезервирован для возможного использования в будущем. class является одним из них, хотя Javascript фактически не использует классы. Другим является goto, и нет абсолютно никаких шансов на то, что он будет использоваться. Результат, однако, заключается в том, что если вы хотите использовать их в качестве json-ключа, тогда он должен быть указан. Строго говоря, вы, вероятно, всегда должны указывать свои ключи, чтобы избежать возможности падения фокуса незанятой зарезервированной ловушки javascript (разумеется - я никогда этого не делаю).