这是有效的自动分号插入吗?

时间:2019-04-11 22:48:44

标签: javascript ecma262 automatic-semicolon-insertion

我一直在摆弄JavaScript,发现一些我不了解的行为。问题似乎出在自动分号(ASI)的问题上,但是对我来说,ASI似乎行为异常。以下代码已通过Unable to resolve service for type 'Rsk.AspNetCore.Authentication.Saml2p.Factories.ISamlFactory``1[IdentityServer4.Saml.Generators.Interfaces.IServiceProviderMetadataGenerator]' while attempting to activate 'Rsk.AspNetCore.Authentication.Saml2p.Saml2pAuthenticationHandler'.以及Google Chrome开发人员工具的控制台(版本73.0.3683.86(正式版本)(64位))进行了测试。

node v8.10

三个点表示> 0 == {} false > {} == 0 ... (取自chrome的开发人员工具的控制台输出。)似乎是由ASI实际上将其转换为Uncaught SyntaxError: Unexpected token ==来解释的,但是通过阅读规格(上面链接),它可以不应该那样做。我误解了规格吗?

这会导致一些有趣的情况,以及一些奇怪的情况。例如,{;} == 0的值为4,因为它是{} + 4或简单地为{;} + 4。但是,+44 + {}。而且,很奇怪:

'4[object Object]'

它并没有变成> {} + 4 + {} '[object Object]4[object Object]' ,它与{;} + 4 + {}相同,现在它实际上接受了第一个4 + {}作为对象而不是块! 最右边的令牌很重要:

{}

现在,第一个> {} + 4 + {} + 4 '4[object Object]4' 再次被解释为空块。此外,

{}

第二行的行为似乎又是ASI,因为> {} + {} '[object Object][object Object]' > {} + {} + 4 NaN +{}的计算结果为Number({})(第一行NaN再次被解释为空块。 )

额外的有趣代码:

{}

这一次,第一个实际上变成了带有标签> {a:3}.a + 2 ... // Uncaught SyntaxError: Unexpected token . > ({a:3}.a + 2) 5 的空块!

我希望在这些示例中不会发生ASI,因为(我认为)它应该已经是语法的有效生成。看来如何才能保持最右边的标记(a{} + 4 + {})的交替很奇怪,它改变了第一个{} + 4 + {} + 4的含义。

0 个答案:

没有答案