Использование зарезервированных слов в качестве имен свойств, пересмотрено

Может reserved word использоваться в качестве имени свойства объекта?

Эта проблема была поднята косвенно в предыдущем вопросе о стекопереработке. ответ казался общим консенсусом @Squeegy:

Вы можете использовать эти слова, но только как строки, а не как сокращенные свойства - foo["class"] это круто, тогда как foo.class не является
услужливо даем ссылку на список зарезервированных слов

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

  • тестирование зарезервированных слов с использованием их в качестве "стенографических" свойств

  • HTMLFormElement делает невозможным не использовать зарезервированные слова в "стенографии"

Во-первых, используя список зарезервированных слов, каждый из них был добавлен в качестве свойства Object а также HTMLElement как obj["word"] а также obj.word и затем извлекается как obj["word"] а также obj.word, В каждом из 63 случаев все восемь тестов работали правильно.

Во-вторых, HTMLFormElement требует этой работы, потому что он получает в своих элементах, используя сокращенную запись. Если <input name='typeof' value='scalar' /> является элементом формы, то form.typeof == "скаляр".

Исходя из моего опыта, зарезервированные слова обычно представляют собой данные (например, столбец с именем "private"), а не программы. Как таковые они загрязняют объекты JSON, а оттуда INPUT и оттуда HTMLFormElement. Проще говоря, без огромного количества (имхо ненужной) работы невозможно сохранить зарезервированные слова, не заставляя работать правильно в краткой записи.

Мне кажется эти настоящие проблемы:

  • необходимо соблюдать осторожность, чтобы не конфликтовать с существующими свойствами, а не зарезервированными словами

  • (многие, если не все) переменные не могут быть зарезервированными словами

  • использование зарезервированных слов в качестве свойств может (но не обязательно) сбивать с толку

Правильно ли тогда сделать такой вывод, что зарезервированные слова в качестве имен свойств и доступ к ним в виде строк или сокращений - это просто замечательно, если к ситуации применяется небольшой здравый смысл?

4 ответа

Решение

В ECMAScript, начиная с ES5, зарезервированные слова могут быть использованы в качестве имен свойств объекта "в положительный момент". Это означает, что их не нужно "заключать в кавычки" при определении литералов объекта, и их можно разыменовывать (для доступа, назначения и удаления) к объектам без необходимости использовать индексную запись в квадратных скобках.

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

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Reserved_Words

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

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

(Однако два небольших замечания: foo["class"] хорошо, не foo[class], И любой способ, которым вы должны использовать form.elements["xyz"] и не form.xyz получить доступ к элементу с именем xyz.)

Да, это можно использовать.

Небольшое замечание: если вы используете YUI-компрессор, вы должны указать имя свойства, равное одному из js зарезервированных слов, в кавычках.

Например, это не будет сжимать

var a = { case : "foo"}; // syntax error, "invalid property id"
a.for = "bar"; // syntax error, "missing name after . operator"

Это будет делать

var a = { "case" : "foo"}; //OK
a["for"] = "bar"; //OK

Вот онлайн сжатие JavaScript/CSS с использованием YUI Compressor, где это можно проверить.

Да, в большинстве браузеров (включая IE9+)

На самом деле в таблице совместимости Kangax есть запись "Зарезервированные слова как имена свойств".

http://kangax.github.io/compat-table/es5/#test-Object/array_literal_extensions_Reserved_words_as_property_names

Другие вопросы по тегам