前言
js語(yǔ)句末尾到底要不要加分號(hào)埠通,早已形成了加分號(hào)黨和不加分號(hào)黨赎离,而且吵得不可開(kāi)交,各有各的道理端辱,但是梁剔,你們都沒(méi)有說(shuō)到點(diǎn)上。如果你是不加分號(hào)黨舞蔽,來(lái)來(lái)來(lái)荣病,先來(lái)執(zhí)行幾條語(yǔ)句。
案例
1渗柿,[
前面不加分號(hào)
將下方代碼拷貝到Chrome瀏覽器的控制臺(tái)運(yùn)行:
console.log('任意字符')
[1,2].forEach(v=>v);
得到
任意字符
Uncaught TypeError: Cannot read property '2' of undefined
2. (
前面不加分號(hào)
試運(yùn)行:
console.log('任意字符')
(1 + 2) === 3 ? 'xx' : 'oo'
得到:
任意字符
Uncaught TypeError: console.log(...) is not a function
3. +
前面不加分號(hào)
console.log('任意字符')
+1
得到:
任意字符
NaN
4. -
前面不加分號(hào)
console.log('任意字符')
-1
得到:
任意字符
NaN
5. /
前面不加分號(hào)
console.log('任意字符')
/1/.test('1') ? 'xx' : 'oo'
得到:
Uncaught SyntaxError: Unexpected token .
什么鬼个盆?每一句都是合法語(yǔ)句,寫(xiě)在一起就報(bào)錯(cuò)朵栖?颊亮!
如果試試給兩句中間敲空行呢?還是報(bào)錯(cuò)T山Α终惑!
怎么回事?
解釋
瀏覽器內(nèi)置的JS編譯器有分號(hào)推斷能力门扇,不加分號(hào)黨也正是據(jù)此堅(jiān)稱無(wú)需加分號(hào)雹有,但是,編譯器又有一個(gè)規(guī)定臼寄,就是總是優(yōu)先將換行符前后的符號(hào)流當(dāng)作一條語(yǔ)句解析霸奕。所以在JS編譯器眼里:
console.log('任意字符')
[1,2].forEach(v=>v)
相當(dāng)于:
console.log('任意字符')[1,2].forEach(v=>v)
這時(shí)候,console.log('任意字符')
被當(dāng)做一個(gè)函數(shù)執(zhí)行語(yǔ)句脯厨,打印任意字符
铅祸,但返回undefined
,接著把undefined
當(dāng)做有屬性的值合武,求undefined
的屬性為2
的值。為什么是2
呢涡扼?因?yàn)?code>1,2會(huì)計(jì)算得到2
稼跳。undefined
當(dāng)然沒(méi)有鍵名為2的值,所以會(huì)報(bào)錯(cuò)Uncaught TypeError: Cannot read property '2' of undefined
吃沪。
其他幾個(gè)例子也是這個(gè)道理汤善。
括號(hào)場(chǎng)景下,會(huì)將前面的部分當(dāng)做函數(shù),前面當(dāng)然不是函數(shù)红淡。
加減號(hào)場(chǎng)景下不狮,會(huì)讓undefined
去加減1
,當(dāng)然得到NaN
在旱。
上面的都是運(yùn)行時(shí)錯(cuò)粗摇零,而斜杠場(chǎng)景下,直接是語(yǔ)法錯(cuò)誤桶蝎。
現(xiàn)在你明白為什么不要做不加分號(hào)黨了吧驻仅?
可能你還會(huì)說(shuō),這幾種場(chǎng)景出現(xiàn)的概率很低登渣,那我也沒(méi)啥可說(shuō)的了噪服,“又不是不能用”總能終結(jié)討論。
總結(jié)
總之胜茧,加分號(hào)除了“要記得敲分號(hào)”之外粘优,沒(méi)有任何副作用,而不加分號(hào)呻顽,閱讀代碼總是要費(fèi)力雹顺,比如:
api
.a({
...this.queryParams,
})
.b((response) => {
this.list = response.data.list;
this.total = response.data.total;
this.loading = false;
})
.c({
...this.queryParams,
})
.d((response) => {
this.list = response.data.list;
this.total = response.data.total;
this.loading = false;
});
api
.a({
...this.queryParams,
})
.b((response) => {
this.list = response.data.list;
this.total = response.data.total;
this.loading = false;
})
.c({
...this.queryParams,
})
.d((response) => {
this.list = response.data.list;
this.total = response.data.total;
this.loading = false;
});
假設(shè)有這么一套代碼,各種then鏈芬位,各種以})
結(jié)尾的語(yǔ)句无拗,如果不加分號(hào),你看的清這是幾條語(yǔ)句么昧碉?
題外篇
當(dāng)然了英染,現(xiàn)在前端開(kāi)發(fā)都會(huì)上ESLint,雖然沒(méi)有測(cè)試過(guò)被饿,但我相信四康,即便你是不加分號(hào)黨,它也會(huì)智能的在上述符號(hào)前面加上分號(hào)(我真的沒(méi)有測(cè)試過(guò)狭握,如果事實(shí)是ESLint做不到闪金,呵呵,真是天不助你們了)论颅。其實(shí)分號(hào)更多的意義還是維護(hù)容易哎垦,代碼能跑通真的不是一切。