Javascript 动态添加名称以数值开头的变量

Javascript 动态添加名称以数值开头的变量,javascript,Javascript,我注意到,如果我试图创建一个键名以数字值开头的对象,就会抛出一个错误(这与此处概述的JavaScript命名一起发生:)。但是,我注意到,如果这样做,我仍然可以动态添加这样一个变量名 失败: object.1foo = "bar"; object = { 1foo: "bar" } 失败: object.1foo = "bar"; object = { 1foo: "bar" } 成功: object["1foo"] = bar; 为什么会这样?当您执行对象[“1foo”]时,

我注意到,如果我试图创建一个键名以数字值开头的对象,就会抛出一个错误(这与此处概述的JavaScript命名一起发生:)。但是,我注意到,如果这样做,我仍然可以动态添加这样一个变量名

失败:

object.1foo = "bar";
object = {
  1foo: "bar"
}
失败:

object.1foo = "bar";
object = {
  1foo: "bar"
}
成功:

object["1foo"] = bar;
为什么会这样?

当您执行
对象[“1foo”]
时,实际上是在转义属性的名称,因此它是有效的

另一个也失败了,因为1foo不是转义的,它是以相同的形式出现的


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

当访问
对象[“1foo”]
时,您并不是在创建标识符,而是在对象内部创建一个键来查找值

标识符不能以数字开头,键没有任何这样的规范(某种“明显”的原因)

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

执行
{“1foo”:123}
时,您没有将
1foo
设置为正确的标识符,它是
string
类型的右值变量


根据ECMA标准 7.6标识符名称和标识符 标识符

  • 标识名称,但不保留
标识名称

  • 标识开始
  • IdentifierName,IdentifierPart
标识开始

  • 单选机
  • $
  • _
  • \单链构象序列
标识部分

  • 标识开始
  • 联合标记
  • 独角兽
  • 单链断开连接

11.1.5对象初始值设定项 PropertyName[可以是以下任意一项]:

  • 识别名
  • StringLiteral
  • 数字文字

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

obj = {}

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

您不应混合使用有效变量名和有效属性名。在您处理对象属性时,根据ECMAScript规范的一节,对象属性名应为有效标识符,或有效字符串,或有效数字

ObjectLiteral :
    {}
    { PropertyNameAndValueList }

PropertyNameAndValueList :
    PropertyName : AssignmentExpression
    PropertyNameAndValueList , PropertyName : AssignmentExpression

PropertyName :
    Identifier
    StringLiteral
    NumericLiteral 
由于
1foo
不是有效的标识符(请参见第节),您不能直接使用它来定义属性。但是(除了您在问题中描述的方法外),您可以使用字符串属性名称来这样做:

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

它们是语义上不同的构造,对运行时环境来说恰好意味着相同的东西。