以下内容来至 es2017 语言规范和 javascript 高级程序设计(第三版)
标识符
红宝书 3.1.2 中,对标识符如是定义:
An identifier is the name of a variable, function, property, or function argument.
我对此存有疑问——属性名是不是标识符?
ES 规范如此定义:
Identifier
IdentifierName but not ReservedWord
属性
ECMAScript 规范中对属性如下定义:
property
part of an object that associates a key (either a String value or a Symbol value) and a value
属性名(上面提到的 key
)其实是一个字符串或者 Symbol 类型值。
属性名
规范如此定义:
PropertyName [Yield, Await]:
LiteralPropertyName
ComputedPropertyName[?Yield, ?Await]
属性访问器
Property Accessors
略
总结为两种表示法:
- 点表示法,例如:
Object.create
- 方括号表示法,例如:
Object['create']
其中,点表示法中要求 .
之后必须跟着 IdentifierName
。我想红宝书里说的是这种情况,并没有包含另一种表示法。
回看上面提到的标识符的定义,这么写的
IdentifierName but not ReservedWord
我们可以在代码中进行如下实验:
var null
// 异常:Uncaught SyntaxError: Unexpected token null
Object.null
// 正常
总结
属性名不是标识符。红宝书的定义比较通俗,但是总结的不算准确。