在Javascript中,有Identifiers
个reserved words无法在Identifier
内使用;其中一些实际上留作将来使用。为了澄清一点,Identifier Name
是Identifier Name
但不是保留字。标识符名称的确切语法与此无关。
根据the last paragraph here,似乎有一些地方可以使用任何a.import
a["import"]
a = { import: "test" }
,即使它是保留字。文章提到有效
foo.if
虽然我很清楚第二种形式是合法的,但我一直认为第一种形式和第三种形式都不合法。
事实上,this resource表示
{
in: foo,
out: bar
}
作为无效代码。
有些地方的保留字实际上是否有效?
作为一种动机,我正在编写一个API来传递表单
的对象是有意义的in
但我不想强迫用户在{{1}}附近添加括号。
答案 0 :(得分:5)
这是第3版和第5版之间ECMA-262的更改(您可以get here)。
在两个版本中,第7.6节将标识符定义为
Identifier ::
IdentifierName but not ReservedWord
但是,在第11.2.1节中,使用点表示法的属性访问器已从
更改MemberExpression . Identifier
CallExpression . Identifier
在第3版
中MemberExpression . IdentifierName
CallExpression . IdentifierName
第5版中的,即使用保留名称作为点访问器确实是合法的现在。
我不知道是否因为对 Identifier 的限制在语法上是不必要的,因为没有一个保留字可以合法地跟随.
,或者它也是编纂了各种实施的现有做法。
PS:经过一番挖掘后,我在版本5的mail from Allen Wirfs-Brock项目编辑器中找到了以下内容:
ES3语法不允许将保留字(例如true和false)用作PropertyName或MemberExpression中句点的右侧。您的测试验证大多数实现符合该限制,而FF具有“非标准”扩展,允许在这些上下文中使用保留字(或至少您测试的那些)。
ES3.1故意采用FF扩展作为语言的标准部分,因此当其他实现最终更新为支持ES3.1时,它们不应该长时间报告您的测试用例错误。
请注意,ECMAScript 3.1是现在称为ECMAScript 5的原始名称。
答案 1 :(得分:1)
虽然大多数浏览器都不会在a.import
处抛出错误,但它并不严格合法。如果你想使用保留字,你必须引用它。
访问http://wwwjslint.com,然后粘贴以下代码:
var d = {
'in': 1
};
此代码有效。但是,当您删除引号时,会生成错误:
第2行第5个问题:预期标识符,而是看到'in'(保留字)。
答案 2 :(得分:1)
MDN文章引用了Firefox符合的Ecmascript 5规范,但并非所有浏览器都以这种方式符合它,即所有浏览器都不符合Ecmascript 5。
答案 3 :(得分:1)
如果没有引用,你不能依赖它们在所有浏览器/实现上工作。
如果有意义,我会尝试将它们更改为“输入”和“输出”之类的东西。您必须在文档中添加关于“in”需要引号的额外句子可能不值得拥有“完美”标识符名称。