Javascript 动态添加名称以数值开头的变量
我注意到,如果我试图创建一个键名以数字值开头的对象,就会抛出一个错误(这与此处概述的JavaScript命名一起发生:)。但是,我注意到,如果这样做,我仍然可以动态添加这样一个变量名 失败:Javascript 动态添加名称以数值开头的变量,javascript,Javascript,我注意到,如果我试图创建一个键名以数字值开头的对象,就会抛出一个错误(这与此处概述的JavaScript命名一起发生:)。但是,我注意到,如果这样做,我仍然可以动态添加这样一个变量名 失败: object.1foo = "bar"; object = { 1foo: "bar" } 失败: object.1foo = "bar"; object = { 1foo: "bar" } 成功: object["1foo"] = bar; 为什么会这样?当您执行对象[“1foo”]时,
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
- 单选机
- $
- _
- \单链构象序列
- 标识开始
- 联合标记
- 独角兽
- 单链断开连接
- 识别名
- 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' }
它们是语义上不同的构造,对运行时环境来说恰好意味着相同的东西。