当设置为JavaScript对象的属性名称时,是否需要引用保留字?

gue*_*314 16 javascript language-lawyer ecmascript-5

给定一个对象文字或jQuery(html, attributes)对象,是否有任何规范说明保留字或未来的保留字必须引用?

或者,例如,class可以设置为对象的属性名称,而不使用引号括起属性名称,而不违反有关标识符,属性名称或保留字的使用的规范?

寻求关于这个问题的确凿答案以避免混淆.

let objLit = {
  class: 123,
  var: "abc",
  let: 456,
  const: "def",
  import: 789
}

console.dir(objLit);

jQuery("<div>012</div>", {
  class: "ghi"
})
.appendTo("body");
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
Run Code Online (Sandbox Code Playgroud)

有关:

规格

标识符名称是根据所述中给出的语法解释令牌Unicode标准的第5章的"标识符"部分,与一些小的修改.
标识符是不是ReservedWord的IdentifierName

Li3*_*357 25

ECMAScript 5+

不,自ECMAScript 5以来不需要引号.原因如下:

正如您在帖子中提到的,来自ECMAScript®5.1语言规范:

7.6标识符名称和标识符

标识符名称是根据Unicode标准第5章"标识符"部分中给出的语法进行解释的标记,并进行了一些小的修改.一个IdentifierIdentifierName这不是一个ReservedWord(参见7.6.1).

[...]

句法

Identifier ::
  IdentifierName but not ReservedWord
Run Code Online (Sandbox Code Playgroud)

根据规范,a ReservedWord是:

7.6.1保留字

保留字是IdentifierName不能用作的字Identifier.

句法

ReservedWord :: 
  Keyword
  FutureReservedWord
  NullLiteral
  BooleanLiteral
Run Code Online (Sandbox Code Playgroud)

这包括关键字,未来关键字null和布尔文字.完整清单如下:

7.6.1.1关键字

break    do       instanceof typeof
case     else     new        var
catch    finally  return     void
continue for      switch     while
debugger function this       with
default  if       throw 
delete   in       try   
Run Code Online (Sandbox Code Playgroud)

7.6.1.2未来保留字

class enum   extends super
const export import
Run Code Online (Sandbox Code Playgroud)

7.8.1空文字

null
Run Code Online (Sandbox Code Playgroud)

7.8.2布尔文字

true
false
Run Code Online (Sandbox Code Playgroud)

上面(第7.6节)暗示IdentifierNames可以是ReservedWords,并且来自对象初始化器的规范:

11.1.5对象初始化器

[...]

句法

ObjectLiteral :
  { }
  { PropertyNameAndValueList }
  { PropertyNameAndValueList , }
Run Code Online (Sandbox Code Playgroud)

在哪里PropertyName,按规格:

PropertyName :
  IdentifierName
  StringLiteral
  NumericLiteral
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,a PropertyName可能是一个IdentifierName,因此允许ReservedWords为PropertyNames.这确凿地告诉我们,通过规范,它允许有ReservedWordS,从而作为classvar作为PropertyNameS ^加引号就像字符串文字或数字文字.


ECMAScript <5

为了更深入地了解为什么在ES5之前的版本中不允许这样做,你必须看看如何PropertyName定义.根据ECMAScript®3语言规范:

PropertyName :
  Identifier
  StringLiteral
  NumericLiteral
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,PropertyName是一个Identifer- 而不是一个IdentifierName,从而导致ReservedWords 不能成为PropertyNames.

  • 顺便说明一下,JSON 格式之所以要求所有属性名称都加引号,是因为该标准是在 ES3 时代制定的,Douglas Crockford 不希望将保留字包含在 JSON 规范中([参考](https:// /youtu.be/-C-JoyNuQJs?t=300))。 (2认同)