Динамическое добавление переменной, имя которой приводит к числовому значению - PullRequest
5 голосов
/ 22 декабря 2011

Я заметил, что если я пытаюсь создать объект с именем ключа, которое приводит к числовому значению, выдается ошибка (что сопровождается именами JavaScript, указанными здесь: Какие символы допустимы для имен переменных JavaScript?).Тем не менее, я заметил, что я все еще могу добавить такое имя переменной динамически, если я сделаю так*

object["1foo"] = bar;

Почему это?

Ответы [ 4 ]

3 голосов
/ 22 декабря 2011

Когда вы делаете object["1foo"], вы на самом деле экранируете имя свойства, поэтому оно работает.

Другое тоже не работает, потому что 1foo не экранируется, оно в той же форме.

Если вы хотите получить доступ к элементам объекта со стандартными точечными обозначениями (например, object.property), вам не разрешается использовать какие-либо специальные символы, кроме _ или $;Кроме того, имя не может начинаться с цифры.Во всех остальных случаях вы должны использовать квадратные скобки и кавычки для доступа к элементам объекта.

2 голосов
/ 22 декабря 2011

То, как формируются идентификаторы, является синтаксическим правилом, то есть оно применяется только при синтаксическом анализе источника вашей программы.Во время выполнения имена полей объекта являются просто произвольными строками, и движку все равно, являются ли эти строки «действительными» с точки зрения синтаксического анализатора:

obj = {}

obj["foo"] - ok
obj["1xx"] - ok
obj["{{{"] - ok
obj["   "] - ok
2 голосов
/ 22 декабря 2011

При доступе к object["1foo"] вы создаете не идентификатор, а ключ для поиска значения внутри вашего объекта.

Идентификаторы не могут начинаться с цифры, ключи не имеют таких спецификаций (типа«очевидных» причин.

Идентификаторы не являются значениями, ключи (в смысле, описанном в этом посте) не являются идентификаторами.

При выполнении {"1foo": 123} вы не делаете 1foo aправильный идентификатор, это переменная rvalue типа string.


В соответствии со стандартом ECMA

7.6 Имена и идентификаторы идентификаторов

Identifier ::

  • IdentifierName, но не ReservedWord

IdentifierName ::

  • IdentifierStart
  • IdentifierName, IdentifierPart

IdentifierStart ::

  • UnicodeLetter
  • $
  • _
  • \ UnicodeEscapeSequence

IdentifierPart ::

  • IdentifierStart
  • UnicodeCombiningMark
  • UnicodeDigit
  • UnicodeConnectorPunctuation

...

11.1.5 Инициализатор объекта

PropertyName [может быть любым из следующих]:

  • IdentifierName
  • StringLiteral
  • NumericLiteral
1 голос
/ 22 декабря 2011

Вы не должны смешивать допустимые имена переменных и допустимые имена свойств. В вашем случае вы имеете дело со свойствами объекта и в соответствии с разделом «Инициализатор объекта» имени свойства объекта спецификации ECMAScript должно быть действительный идентификатор или допустимая строка или действительный номер :

ObjectLiteral :
    {}
    { PropertyNameAndValueList }

PropertyNameAndValueList :
    PropertyName : AssignmentExpression
    PropertyNameAndValueList , PropertyName : AssignmentExpression

PropertyName :
    Identifier
    StringLiteral
    NumericLiteral 

Поскольку 1foo не является допустимым идентификатором (см. «Идентификаторы» раздел), вы не можете использовать его напрямую для определения свойства. Но (помимо способов, описанных в вопросе), вы можете сделать это, используя строковое имя свойства:

object = { '1foo': 'bar' }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...