Javascript中保留字的使用
在Javascript中,有各种各样的代码不能在Javascript中保留字的使用,javascript,identifier,ecma262,Javascript,Identifier,Ecma262,在Javascript中,有各种各样的代码不能在标识符中使用;其中一些实际上是保留供将来使用的。为了澄清一点,标识符是标识符名称,但不是保留字。标识符名称的确切语法与此无关 然而,根据我们的研究,似乎在某些地方使用任何标识符名称都是有效的,即使它是一个保留字。这篇文章提到的是有效的 a.import a["import"] a = { import: "test" } 虽然我很清楚第二种形式是合法的,但我一直认为第一种和第三种形式是不合法的 实际上,表示 作为无效代码 是否有一些地方被保留的话
标识符中使用;其中一些实际上是保留供将来使用的。为了澄清一点,标识符
是标识符名称
,但不是保留字。标识符名称的确切语法与此无关
然而,根据我们的研究,似乎在某些地方使用任何标识符名称
都是有效的,即使它是一个保留字。这篇文章提到的是有效的
a.import
a["import"]
a = { import: "test" }
虽然我很清楚第二种形式是合法的,但我一直认为第一种和第三种形式是不合法的
实际上,表示
作为无效代码
是否有一些地方被保留的话实际上是有效的
作为动机,我正在编写一个API,在这里传递表单的对象是有意义的
{
in: foo,
out: bar
}
但是我不想强迫用户在
中用括号括起,尽管大多数浏览器不会在a.import
中抛出错误,但这并不严格合法。如果你想使用保留字,你必须引用它
访问并粘贴以下代码:
var d = {
'in': 1
};
此代码是有效的。但是,删除引号时,会生成一个错误:
第2行字符5处出现问题:应为标识符,而应为“in”(保留字)
MDN文章引用了Firefox遵守的Ecmascript 5规范,但并非所有浏览器都以这种方式遵守,也就是说,并非所有浏览器都符合Ecmascript 5。如果没有引用,您不能依赖它们在所有浏览器/实现上工作
如果有意义的话,我会尝试将它们改为“输入”和“输出”。您必须在文档中添加的关于“in”需要引号的额外句子可能不值得使用“完美”标识符名称。这是ECMA-262第3版和第5版之间的更改(您可以)
在这两个版本中,第7.6节将标识符定义为
然而,在第11.2.1节中,使用点符号的属性访问器从
MemberExpression . Identifier
CallExpression . Identifier
第3版至
MemberExpression . IdentifierName
CallExpression . IdentifierName
在第5版中,ie使用保留名称作为点访问器现在确实是合法的
我不知道这一更改是否仅仅是因为对标识符的限制在语法上是不必要的,因为任何保留字都不能合法地遵循
,或者它是否也编纂了各种实现的现有实践
PS:经过一些挖掘,我在第5版的项目编辑器中发现了以下内容:
ES3语法不允许将保留字(如true和false)用作PropertyName或MemberExpression中句点右侧的保留字。您的测试验证了大多数实现都符合该限制,而FF有一个“非标准”扩展,允许在这些上下文中使用保留字(或至少是您测试的保留字)
ES3.1有意采用FF扩展作为语言的标准部分,因此当其他实现最终更新为支持ES3.1时,它们不会再为您的测试用例报告错误
请注意,ECMAScript 3.1是现在称为ECMAScript 5的原始名称。这并不能真正回答我的问题。是的,jslint抱怨,但我不确定Crockford是否做对了。当然,我知道每个字符串都可以用引号作为属性名。但我想知道为什么MDN的人声称可以省略这些引用。我在寻找规范相关部分的链接,但我自己找不到。@Andrea调用JavaScript控制台,键入vard={a:1}
。结果是{a:1}
。当您输入{import:1}
时,将显示以下错误:语法错误:import是保留标识符
。(Firefox 7.0.1)。有关此问题发生的“真实”示例,请参阅:。开发人员不知道保留字,因此遇到了麻烦。@RobW-var d={import:1}代码>不会为我抛出错误。@jamesalardice没有var d
前缀。嗯。。。如果它在Firefox中不起作用,即使它是合法的,也是一个坏主意!:-)如果“in”和“out”在语义上对您的API最有意义,那么即使用户必须引用它们,也要继续使用它们。(我想你的意思是“加引号”,而不是“放括号”。)谢谢,这正是我需要的!:-)
MemberExpression . Identifier
CallExpression . Identifier
MemberExpression . IdentifierName
CallExpression . IdentifierName