ES6模板字符串和自动分号插入

Den*_*ker 0 javascript ecmascript-6

请考虑以下代码:

`abc`.split(`b`)
`abc`.split(`b`)
Run Code Online (Sandbox Code Playgroud)

这失败了 TypeError: "abc".split(...) is not a function

在这里试试吧.

为了使它工作,我们需要在这两个语句之间插入一个分号.如果我们在第二行使用常规字符串,代码也能正常工作:

`abc`.split(`b`)
"abc".split(`b`)
Run Code Online (Sandbox Code Playgroud)

这种行为的原因是什么?

我想它与自动分号插入做了一些不好的事情有关,但我无法弄清楚这会是什么.
事实上,常规字符串和模板字符串之间似乎存在差异,这让我很困惑.那些不应该等同吗?

Ber*_*rgi 6

模板文字可以用函数标记,字符串文字不能.请注意

tag`a ${x} b`;
Run Code Online (Sandbox Code Playgroud)

基本上相当于

tag("a ", x, " b");
Run Code Online (Sandbox Code Playgroud)

由于您的表达式`abc`.split(`b`) `abc`.split(`b`)在语法上有效,因此此处不会发生自动分号插入.不要在必要时省略分号.这并不是说ASI做的很糟糕,它只是在你期望的时候什么都不做.

如果你想省略分号,让他们自动插入过的位置可能需要,您将需要把一个在开始每一个开头线(,[,/,+,-`.