动态添加名称以数字值引导的变量

时间:2011-12-22 13:51:37

标签: javascript

我注意到,如果我尝试使用带有数字值的键名创建一个对象,则会抛出一个错误(这与此处概述的JavaScript命名一致:What characters are valid for JavaScript variable names?)。但是,我注意到,如果我这样做,我仍然可以动态添加这样一个变量名

失败:

object.1foo = "bar";

失败:

object = {
  1foo: "bar"
}

成功:

object["1foo"] = bar;

为什么?

4 个答案:

答案 0 :(得分:3)

执行object["1foo"]时,您实际上是在逃避该属性的名称,这就是它的工作原理。

另一个也失败了,因为1foo没有被转义,它的形式相同。

如果要使用标准点表示法(例如object.property)访问对象成员,除了_或$之外,不允许使用任何特殊字符;除此之外,名称不能以数字开头。对于所有其他情况,您不得不使用方括号和引号来访问对象元素。

答案 1 :(得分:2)

访问object["1foo"]时,您不是在创建标识符,而是在对象中查找值的键。

标识符不能以数字开头,键不具有任何此类规范(“显而易见”的原因。

标识符不是值,键(在本文中描述的意义上)不是标识符。

执行{"1foo": 123}时,您没有使1foo成为正确的标识符,而是string类型的右值变量。


根据ECMA标准

  

7.6标识符名称和标识符

     

标识符 ::

     
      
  • IdentifierName但不是ReservedWord
  •   
     

IdentifierName ::

     
      
  • IdentifierStart
  •   
  • IdentifierName,IdentifierPart
  •   
     

IdentifierStart ::

     
      
  • UnicodeLetter
  •   
  • $
  •   
  • _
  •   
  • \ UnicodeEscapeSequence
  •   
     

IdentifierPart ::

     
      
  • IdentifierStart
  •   
  • UnicodeCombiningMark
  •   
  • UnicodeDigit
  •   
  • UnicodeConnectorPunctuation
  •   
  • < ZWNJ>
  •   
  • < ZWJ>
  •   

...

  

11.1.5对象初始值设定项

     

PropertyName [可以是以下任何一种]:

     
      
  • IdentifierName
  •   
  • 串文字
  •   
  • NumericLiteral
  •   

答案 2 :(得分:2)

如何形成标识符是一种语法规则,也就是说,它仅适用于解析程序源的情况。在运行时,对象字段的名称只是任意字符串,引擎不关心这些字符串是否从解析器的角度来看是“有效的”:

obj = {}

obj["foo"] - ok
obj["1xx"] - ok
obj["{{{"] - ok
obj["   "] - ok

答案 3 :(得分:1)

您不应混合有效的变量名称和有效的属性名称。在您的情况下,您正在处理对象属性,并根据ECMAScript规范的"Object Initialiser"部分,对象属性名称应为有效标识符,或有效字符串,或< strong>有效数字:

ObjectLiteral :
    {}
    { PropertyNameAndValueList }

PropertyNameAndValueList :
    PropertyName : AssignmentExpression
    PropertyNameAndValueList , PropertyName : AssignmentExpression

PropertyName :
    Identifier
    StringLiteral
    NumericLiteral 

由于1foo无效标识符(请参阅"Identifiers"部分),因此无法直接使用它来定义属性。但是(除了你在问题中描述的方式)你可以像使用字符串属性名称那样做:

object = { '1foo': 'bar' }