当您使用对象文字时,属性名称可以是以下任何一种:
IdentifierName
StringLiteral
NumericLiteral
StringLiteral
并且NumericLiteral
应该清楚。究竟是什么IdentifierName
?
让我们看一下规范的第 7.6 节:
IdentifierName ::
IdentifierStart
IdentifierName *IdentifierPart*
IdentifierStart ::
UnicodeLetter
$
_
\
UnicodeEscapeSequence
IdentifierPart ::
IdentifierStart
UnicodeCombiningMark
UnicodeDigit
UnicodeConnectorPunctuation
<ZWNJ>
<ZWJ>
所以,IdentifierName
真的是如上所述的任何字符序列。是否是保留字无关紧要。
可用于变量和函数名称的名称称为Identifier
s 并定义为:
标识符 ::
IdentifierName但不是ReservedWord
您会看到,保留字被明确排除为标识符的可能性,但不适用于对象属性。
但是,您永远不知道解析器有多“好”以及它是否遵守所有规则。此外,诸如 JSHint 之类的 linting 工具通常会警告您使用了保留关键字,尽管它是有效的。为了安全起见,您应该将这些词放在引号中,甚至使用括号符号来访问它:
var foo = {'delete': ... }
foo['delete'] = ....;
如果这太麻烦,请不要使用保留字作为属性名称。例如delete
,您可以使用代替remove
。