JS Promises/A +的'catch'方法名称是否无效,因为它是JS关键字?

Foz*_*ozi 8 javascript promise ecmascript-5

我最近开始在一个项目中使用JS Promises.我注意到每次我使用.catch我的JS linter抱怨.它确实运行并做了它应该做的事情,但我查找了ECMAScript规范,它看起来确实是正确的:因为它catch是一个关键字,它不能用作标识符.据我所知,方法名称是标识符,所以这是无效的:

Promise.reject("Duh").catch(alert);
Run Code Online (Sandbox Code Playgroud)

它应该是这样的:

Promise.reject("Duh")['catch'](alert);
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Ber*_*rgi 16

我错过了什么?

属性名称不是标识符,它可以使用任何标识符名称.从属性访问者的规范:

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

标识符:

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

您可以在点属性访问中使用任何任意标识名称(但不能使用整数),但不能将[保留]关键字用作标识符,例如在变量或函数名称中.

但是,这确实随着ES5而改变,回到EcmaScript 3中,属性名称必须是标识符.这就是为什么你仍然需要为关键字使用括号表示法,如果你想支持旧版浏览器; 这就是为什么你的linter抱怨它的原因.同样适用于对象文本属性名称.

  • @Evert:对不起,[你是对的,我对使用这种策略感到羞耻](http://meta.stackexchange.com/q/9731/183280) - 只是它运作得太好了.不过,我的意图是永远不会给出一个不完整的答案. (2认同)