在Javascript中使用保留字

And*_*rea 3 javascript identifier ecma262

在Javascript中有各种不能在里面使用的保留字Identifiers ; 其中一些实际上留作将来使用.为了澄清一点,一个Identifier是一个Identifier Name但不是保留的词.标识符名称的确切语法与此无关.

根据这里的最后一段,似乎有一些地方可以使用任何一个Identifier Name,即使它是一个保留字.文章提到有效

a.import
a["import"]
a = { import: "test" }
Run Code Online (Sandbox Code Playgroud)

虽然我很清楚第二种形式是合法的,但我一直认为第一种形式和第三种形式都不合法.

实际上,这个资源表示

foo.if
Run Code Online (Sandbox Code Playgroud)

作为无效代码.

是否有一些地方保留的话实际上是有效的?

作为一种动机,我正在编写一个API来传递表单的对象是有意义的

{
    in: foo,
    out: bar
}
Run Code Online (Sandbox Code Playgroud)

但我不想强迫用户放置括号in.

Chr*_*oph 5

这是版本3和版本5之间的ECMA-262的更改(您可以在此处获得).

在这两个版本中,第7.6节将标识符定义为

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

但是,在第11.2.1节中,使用点表示法的属性访问器已更改

MemberExpression . Identifier
CallExpression . Identifier
Run Code Online (Sandbox Code Playgroud)

在第3版到

MemberExpression . IdentifierName
CallExpression . IdentifierName
Run Code Online (Sandbox Code Playgroud)

在第5版中,即使用保留名称作为点访问器现在确实合法.

我不知道这个改变是否仅仅是因为对标识符的限制在语法上是不必要的,因为没有一个保留字可以合法地遵循a .,或者它是否也编纂了各种实现的现有实践.

PS:经过一番挖掘,我在第5版项目编辑Allen Wirfs-Brock邮件中发现了以下内容:

ES3语法不允许将保留字(例如true和false)用作PropertyName或MemberExpression中句点的右侧.您的测试验证大多数实现符合该限制,而FF具有"非标准"扩展,允许在这些上下文中使用保留字(或至少您测试的那些).

ES3.1故意采用FF扩展作为语言的标准部分,因此当最终更新其他实现以支持ES3.1时,它们不应该为您的测试用例报告错误.

请注意,ECMAScript 3.1是现在称为ECMAScript 5的原始名称.