我一直在摆弄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
。但是,+4
是4 + {}
。而且,很奇怪:
'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
的含义。