前言
我们在写js代码时发现有时候没写分号也不会报错,但是有时候就报错了,到底什么时候该写,什么时候不用写呢?
我不想看规则,直接看结论
自动分号插入机制
JavaScript有着自动分号插入的机制(Automatic Semicolon Insertion),简称ASI。这是一个辅助性的功能
ASI的规则
- 新行并入当前行将构成非法语句,自动插入分号
if(1 < 10) a = 1
console.log(a)
// 等价于
if(1 < 10) a = 1;
console.log(a);
- 在continue,return,break,throw后自动插入分号
return
{a: 1}
// 等价于
return;
{a: 1};
- ++、–后缀表达式作为新行的开始,在行首自动插入分号
a
++
c
// 等价于
a;
++c;
- 代码块的最后一个语句会自动插入分号
function(){ a = 1 }
// 等价于
function(){ a = 1; }
No ASI的规则
- 新行以 ( 开始
var a = 1
var b = a
(a+b).toString()
// 会被解析为以a+b为入参调用函数a,然后调用函数返回值的toString函数
var a = 1
var b =a(a+b).toString()
- 新行以 [ 开始
var a = ['a1', 'a2']
var b = a
[0,1].slice(1)
// 会被解析先获取a[1],然后调用a[1].slice(1)。
// 由于逗号位于[]内,且不被解析为数组字面量,而被解析为运算符,而逗号运算符会先执行左侧表达式,然后执行右侧表达式并且以右侧表达式的计算结果作为返回值
var a = ['a1', 'a2']
var b = a[0,1].slice(1)
- 新行以 / 开始
var a = 1
var b = a
/test/.test(b)
// /会被解析为整除运算符,而不是正则表达式字面量的起始符号。浏览器中会报test前多了个.号
var a = 1
var b = a / test / .test(b)
- 新行以 + 、 - 、 % 和 * 开始
var a = 2
var b = a
+a
// 会解析如下格式
var a = 2
var b = a + a
- 新行以 , 或 . 开始
var a = 2
var b = a
.toString()
console.log(typeof b)
// 会解析为
var a = 2
var b = a.toString()
console.log(typeof b)
结论
在一般情况下我们可以省略分号;
在以 ( [ / + -
开头的语句前加分号
(由于正常写法均不会出现以. , * %
作为语句开头,因此只需记住前面5个即可,你看能懒则懒哦)
var a = 1
var b = a
;(a+b).toString() //语句前加分号
参考于:
https://www.cnblogs.com/fsjohnhuang/p/4154503.html