Использование зарезервированных слов в качестве имен свойств, вновь
Можно ли использовать зарезервированное слово в качестве имени свойства объекта?
Эта проблема была косвенно затронута в предыдущем вопросе Qaru: Поддержка браузером использования зарезервированного слова в качестве имени свойства в JavaScript. Ответ казался общим консенсусом Алекса Уэйна:
Вы можете использовать эти слова, но только как строки, а не как сокращение свойства.
foo['class']; // cool
foo.class; // not cool
Хотя я думаю, что они, вероятно, более осведомлены, чем я, в этой области, и, вероятно, в некоторых ситуациях использование зарезервированных слов является плохой идеей, я думаю, что их вывод неверен, основываясь на двух моментах:
Сначала, используя список зарезервированных слов, каждое из них было добавлено в качестве свойства к Object
и HTMLElement
, как к obj["word"]
и obj.word
, а затем получено как obj["word"]
и obj.word
. В каждом из 63 случаев все восемь тестов работали правильно.
Во-вторых, HTMLFormElement требует этой работы, потому что он получает в своих элементах, используя сокращенную запись. Если <input name='typeof' value='scalar' />
является элементом формы, то form.typeof
== "scalar".
Из моего опыта зарезервированные слова обычно представляют собой данные (например, столбец с именем "private"), а не программы. Как таковые они загрязняют объекты JSON, и оттуда вводят, а оттуда HTMLFormElement. Проще говоря, без огромного количества (ИМХО ненужного) труда невозможно сохранить зарезервированные слова, не заставляя их работать правильно в стенографии.
Мне кажется эти настоящие проблемы:
необходимо соблюдать осторожность, чтобы не конфликтовать с существующими свойствами, а не с зарезервированными словами
(многие, если не все) переменные не могут быть зарезервированными словами
использование зарезервированных слов в качестве свойств может (но не обязательно) вводить в заблуждение
Правильно ли тогда сделать такой вывод, что зарезервированные слова в качестве имен свойств и доступ к ним в виде строк или сокращений - это просто замечательно, если к ситуации применяется немного здравого смысла?
Ответы
Ответ 1
В ECMAScript, начиная с ES5, зарезервированные слова могут использоваться как имена свойств объекта "в баффе". Это означает, что они не должны быть "одеты" в кавычки при определении объектных литералов, и они могут быть разыменованы (для доступа, назначения и удаления) на объектах без использования нотации индексации квадратной скобки.
Таким образом, зарезервированные слова все еще НЕ могут использоваться в качестве имен идентификаторов. Об этом сказано довольно однозначно в спецификации, и здесь сказано несколько подчеркнуто (если вы не хотите, чтобы ваши глаза истекали кровью, если вам нужно было прочитать фактическую спецификацию языка)...
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Reserved_Words
Ниже перечислены ключевые слова и не могут использоваться как переменные, функции, методы или идентификаторы объектов, поскольку ECMAScript определяет для них особое поведение:
Ответ 2
Я не совсем уверен, что вы хотите сделать, поэтому единственный ответ, который я могу дать, это: Да, это нормально использовать зарезервированные слова в качестве имен свойств.
(Однако два небольших замечания: foo["class"]
это нормально, а не foo[class]
. И любым способом вы должны использовать form.elements["xyz"]
, а не form.xyz
для доступа к элементу с именем xyz
.)
Ответ 3
Да, его можно использовать.
Небольшое замечание: если вы используете 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, где это можно проверить.
Ответ 4
Да, в большинстве браузеров (включая IE9 +)
Фактически есть запись в таблице совместимости Kangax для "Зарезервированные слова как имена свойств"
http://kangax.github.io/compat-table/es5/#test-Object/array_literal_extensions_Reserved_words_as_property_names