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章"标识符"部分中给出的语法进行解释的标记,并进行了一些小的修改.一个
Identifier是IdentifierName这不是一个ReservedWord(参见7.6.1).[...]
句法
Run Code Online (Sandbox Code Playgroud)Identifier :: IdentifierName but not ReservedWord
根据规范,a ReservedWord是:
7.6.1保留字
保留字是
IdentifierName不能用作的字Identifier.句法
Run Code Online (Sandbox Code Playgroud)ReservedWord :: Keyword FutureReservedWord NullLiteral BooleanLiteral
这包括关键字,未来关键字null和布尔文字.完整清单如下:
7.6.1.1关键字
Run Code Online (Sandbox Code Playgroud)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 try7.6.1.2未来保留字
Run Code Online (Sandbox Code Playgroud)class enum extends super const export import7.8.1空文字
Run Code Online (Sandbox Code Playgroud)null7.8.2布尔文字
Run Code Online (Sandbox Code Playgroud)true false
上面(第7.6节)暗示IdentifierNames可以是ReservedWords,并且来自对象初始化器的规范:
11.1.5对象初始化器
[...]
句法
Run Code Online (Sandbox Code Playgroud)ObjectLiteral : { } { PropertyNameAndValueList } { PropertyNameAndValueList , }
在哪里PropertyName,按规格:
Run Code Online (Sandbox Code Playgroud)PropertyName : IdentifierName StringLiteral NumericLiteral
正如你所看到的,a PropertyName可能是一个IdentifierName,因此允许ReservedWords为PropertyNames.这确凿地告诉我们,通过规范,它允许有ReservedWordS,从而作为class和var作为PropertyNameS ^加引号就像字符串文字或数字文字.
ECMAScript <5
为了更深入地了解为什么在ES5之前的版本中不允许这样做,你必须看看如何PropertyName定义.根据ECMAScript®3语言规范:
Run Code Online (Sandbox Code Playgroud)PropertyName : Identifier StringLiteral NumericLiteral
正如你所看到的那样,PropertyName是一个Identifer- 而不是一个IdentifierName,从而导致ReservedWords 不能成为PropertyNames.
| 归档时间: |
|
| 查看次数: |
910 次 |
| 最近记录: |