Подтвердить что ты не робот

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

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

Эта проблема была косвенно затронута в предыдущем вопросе Qaru: Поддержка браузером использования зарезервированного слова в качестве имени свойства в JavaScript. Ответ казался общим консенсусом Алекса Уэйна:

Вы можете использовать эти слова, но только как строки, а не как сокращение свойства.

foo['class']; // cool
foo.class;    // not cool

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

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

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 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, где это можно проверить.