azl397985856 / fe-interview

宇宙最强的前端面试指南 (https://lucifer.ren/fe-interview)
Apache License 2.0
2.83k stars 260 forks source link

【每日一题】- 2020-04-23 - 以下代码输出什么?为什么? #117

Closed azl397985856 closed 4 years ago

azl397985856 commented 4 years ago
 a = 123 
 /hi/g.exec('hi lucifer');
suukii commented 4 years ago

会报错。 因为 JS 代码执行的一般规则是,“能合并就合并”,因为 a = 123 没有用 ; 结束,所以 JS 引擎会看它能不能和下一行合并起来一起运行。因为下一行的 / 可以被理解为数学计算“除以”,所以 JS 引擎会尝试执行 a = 123/hi 并报错。

azl397985856 commented 4 years ago

浏览器有时候会在行末尾(行分隔符后)自动添加分号(;),但是有时候不会。具体可以看下ECMA标准:http://ecma-international.org/ecma-262/5.1/#sec-7.9.2

对于这道题来说,并不会。而是会被解析为:

 a = 123 / hi/g.exec('hi lucifer');

即123 除以 hi 除以 g.exec('hi lucifer')。

更本质上来说,LineTerminator 后的第一个非空白、非注释字符是斜线(/),并且这个句法上下文允许除法或除赋值运算符。

其中

LineTerminator ::
   <LF>
   <CR>
   <LS>
   <PS>

上面提到了两个字“允许”。 那不允许是什么情况呢?eg:

 a = //
 /hi/g.exec('hi lucifer');

如上是不会自动连接的,原因是加入自动连接那么会不合法。eg:

 a =  /// hi/g.exec('hi lucifer');

因此手动添加分号(;)是一个好习惯。即:

 a = 123; 
 /hi/g.exec('hi lucifer');
stale[bot] commented 4 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.