問題
請問下面這行代碼的執(zhí)行的結(jié)果?
++[[]][+[]]+[+[]]
第一眼看到這個(gè)很可能是懵逼的,這是個(gè)什么玩意兒,能執(zhí)行嗎?
第一個(gè)要點(diǎn):
+[] = ?

firefox測試運(yùn)算結(jié)果.png
重點(diǎn)來了: +"" = 0
根據(jù)周愛民老師《JavaScript語言精髓與編程實(shí)踐》,單個(gè)加號作為運(yùn)算符在JavaScript中有三種作用。
- 標(biāo)識字符串連接
- 表示數(shù)字取正值的一元運(yùn)算符
- 表示數(shù)值表達(dá)式的求和運(yùn)算。
加號在對數(shù)字取正值時(shí),如果后面接的數(shù)據(jù)不是數(shù)字,那么會進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
所以表達(dá)式++[[]][+[]]+[+[]]可以簡化為
++[[]][0]+[0]
在這里++[[]][0]=+(+[[]][0]+1) = +(0+1) = 1
然后再次簡化為
1+[0]=1+"0" = 10
加號運(yùn)算符的另外一條規(guī)則是如果表達(dá)式中存在字符串,則優(yōu)先按照字符串連接進(jìn)行運(yùn)算。所以數(shù)字1和字符串"0"相加,得到的結(jié)果是字符串"10"