我注意到,如果我尝试使用带有数字值的键名创建一个对象,则会抛出一个错误(这与此处概述的JavaScript命名一致:What characters are valid for JavaScript variable names?)。但是,我注意到,如果我这样做,我仍然可以动态添加这样一个变量名
失败:
object.1foo = "bar";
失败:
object = {
1foo: "bar"
}
成功:
object["1foo"] = bar;
为什么?
答案 0 :(得分:3)
执行object["1foo"]
时,您实际上是在逃避该属性的名称,这就是它的工作原理。
另一个也失败了,因为1foo没有被转义,它的形式相同。
如果要使用标准点表示法(例如object.property)访问对象成员,除了_或$之外,不允许使用任何特殊字符;除此之外,名称不能以数字开头。对于所有其他情况,您不得不使用方括号和引号来访问对象元素。
答案 1 :(得分:2)
访问object["1foo"]
时,您不是在创建标识符,而是在对象中查找值的键。
标识符不能以数字开头,键不具有任何此类规范(“显而易见”的原因。
标识符不是值,键(在本文中描述的意义上)不是标识符。
执行{"1foo": 123}
时,您没有使1foo
成为正确的标识符,而是string
类型的右值变量。
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' }