Использование зарезервированных слов в качестве имен свойств, пересмотрено
Может 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 есть запись "Зарезервированные слова как имена свойств".