鍍金池/ 問答/HTML/ 為什么JS用分號結(jié)尾和沒用分號結(jié)尾執(zhí)行的結(jié)果不一致?

為什么JS用分號結(jié)尾和沒用分號結(jié)尾執(zhí)行的結(jié)果不一致?

代碼1:
var a = 'Aaa';
var b = 'Bbb';
[a, b] = [b, a];
console.log(a);
console.log(b);

結(jié)果:
Bbb
Aaa


代碼2:
var a = 'Aaa'
var b = 'Bbb'
[a, b] = [b, a]
console.log(a);
console.log(b);

結(jié)果:
Aaa
[ undefined, 'Aaa' ]

如果說JS并不強(qiáng)行要求每行語句末尾必須要用分號結(jié)尾的話,上面兩段代碼按道理來說結(jié)果不是應(yīng)該一致的嗎?

測試環(huán)境:node v6.10.2

回答
編輯回答
尐懶貓

clipboard.png

看圖就知道了,我 vscode 裝的 Eslint ,可以自動格式化糾錯的會自動格式化糾錯,這樣就看到解析器的執(zhí)行邏輯了。

2018年3月21日 08:04
編輯回答
茍活

不強(qiáng)制要求,是在沒有歧義的情況下。你的第二句和第三句有歧義,合并為一條語句也可以。

再舉個例子

a = func
(...)

不加分號會合并成一行,變成了執(zhí)行func函數(shù),會導(dǎo)致運行時錯誤或邏輯錯誤。

2017年4月2日 16:43
編輯回答
別瞎鬧

不強(qiáng)行要求分號不代表不寫分號是正確的。解釋器會自動加分號,不保證完全能按你的意思加分號也許就加錯分號了,結(jié)果就錯了。變成了

var a = 'Aaa';
var b = 'Bbb'[a, b] = [b, a];
console.log(a);
console.log(b);
2017年10月30日 17:32
編輯回答
紓惘

其實代碼和說話一樣,加分號好比加上標(biāo)點符號。你加了分號機(jī)器就按照你的意思來走,不加分號那機(jī)器就按照它的理解來走,

舉個例子:

你說:下雨天留客天留我不留。

那別人理解為:
1、下雨天留客,天留我不留。
2、下雨天留客,天留,我不留。
3、下雨天留客,天留我?不留。
4、下雨天留客,天留我不?留。
5、下雨,天留客;天留我不留!
6、下雨天,留客天,留我?不留。
7、下雨天,留客天,留我不?留。
8、下雨天,留客天,留我不留?

代碼也是一個意思,不同的結(jié)果只是因為有歧義,上面兩個回答很好的說明了,我就不贅述了,?

2017年6月22日 04:31
編輯回答
糖果果

并不是所有地方都可以不加分號。你的問題處在:

var b = 'Bbb'[a, b] = [b, a];

回頭來看看這道題其實還蠻有意思的。所以我來繼續(xù)講解分析下:

================

詳細(xì)講解

為什么此時b輸出:[undefined, "Aaa"]呢?

課外知識:首先這里有一個連等

var a = b =c;

這里b=c是一個賦值語句也是一個表達(dá)式,實際上是var a = (b = c),相當(dāng)于:

b=c;
a=c;

回到原題:
原本使用[a,b]=[b,a]是用到了結(jié)構(gòu)賦值的數(shù)組交換賦值。
but,一旦變成:var b = 'Bbb'[a, b] = [b, a]之后,意義就變了,變成了:

var b = [b, a]

這樣就簡單了,明顯給b賦值一個數(shù)組,但是數(shù)組第一個元素b是undefined!
所以輸出:
b = [undefined, "Aaa"]

2017年12月14日 09:42
編輯回答
吢丕
var aaa = 'Aaa'
var bbb = 'Bbb'
var [aaa, bbb] = [bbb, aaa]
console.log(aaa)
console.log(bbb)

不用分號也行

2018年3月4日 13:19