использование зарезервированных слов в качестве имен свойств, пересмотрено - PullRequest
43 голосов
/ 11 августа 2011

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

Эта проблема возникла в ходе косвенного ответа stackoverflow .Ответ @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 == "scalar".

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

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

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

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

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

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

Ответы [ 4 ]

48 голосов
/ 28 июля 2013

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

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

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

7 голосов
/ 11 августа 2011

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

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

6 голосов
/ 30 августа 2013

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

Просто небольшое замечание: если вы используете 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 , где это можно проверить.

2 голосов
/ 21 января 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...