typeof 的兩種寫法:
- typeof a
- typeof(a)
大部分情況下是通用的续誉。
但是昨天遇到了一個(gè)情況鹦付,大概是這樣子:
document.write(typeof 18-'aaa');
...
document.write(typeof(18-'aaa'));
結(jié)果屏幕輸出的卻是
NaN number
問題來了,一個(gè)方法的兩種寫法掌动,為什么結(jié)果會(huì)不一樣呢糙麦?
想來想去吆鹤,歸根結(jié)底還是個(gè) 運(yùn)算符 的優(yōu)先級(jí) 問題宝泵。
運(yùn)算符 | 描述 |
---|---|
. [] () | 字段訪問好啰、數(shù)組下標(biāo)、函數(shù)調(diào)用以及表達(dá)式分組 |
++ -- - ~ ! delete new typeof void | 一元運(yùn)算符儿奶、返回?cái)?shù)據(jù)類型框往、對(duì)象創(chuàng)建、未定義值 |
* / % | 乘法闯捎、除法椰弊、取模 |
+ - + | 加法、減法瓤鼻、字符串連接 |
<< >> >>> | 移位 |
< <= > >= instanceof | 小于秉版、小于等于、大于茬祷、大于等于清焕、instanceof |
== != === !== | 等于、不等于祭犯、嚴(yán)格相等秸妥、非嚴(yán)格相等 |
& | 按位與 |
^ | 按位異或 |
| | 按位或 |
&& | 邏輯與 |
|| | 邏輯或 |
?: | 條件 |
= oP= | 賦值、運(yùn)算賦值 |
, | 多重求值 |
解析:
- typeof (18-'aaa')中沃粗,
() 運(yùn)算符優(yōu)先度比 typeof 高筛峭,所以 (18-'aaa') 內(nèi)優(yōu)先計(jì)算得出 typeof(NaN) ,
然后進(jìn)行typeof運(yùn)算判斷類型陪每,結(jié)果是 "number" 影晓。
typeof (18-'aaa')= typeof(NaN) = "number"
- typeof 18-'aaa'中,
typeof 優(yōu)先級(jí)比 - 高,所以先進(jìn)行 typeof 18 運(yùn)算檩禾,返回一個(gè)“number”挂签,
此時(shí)運(yùn)算式就變成了 “number”-“aaa” ,結(jié)果就是個(gè) NaN .
typeof 18-'aaa' = (typeof 18)-'aaa' = “number”-“aaa” = NaN
總結(jié):
js語法中有不少看似一樣效果的不同寫法,但還是建議按照最嚴(yán)謹(jǐn)?shù)膶懛▉怼?br> 類似的還有:
強(qiáng)轉(zhuǎn)數(shù)值類型中的數(shù)制( 0 八進(jìn)制盼产,0x 十六進(jìn)制)
- 例如:將16進(jìn)制的f轉(zhuǎn)換為10進(jìn)制
document.writeln(Number('0xf'));
document.writeln(parseInt('0xf'));
document.writeln(parseFloat('0xf'));
結(jié)果是
15 15 0
parseFloat理解成了提取‘0xf’字符串中的數(shù)值饵婆。
- 再如:將8進(jìn)制的70轉(zhuǎn)換為10進(jìn)制
document.writeln(Number('070'));
document.writeln(parseInt('070'));
document.writeln(parseFloat('070'));
70 70 70
都理解成了提取‘070’字符串中的數(shù)值。
- 再再如:這次補(bǔ)充說明要進(jìn)行8進(jìn)制轉(zhuǎn)換為10進(jìn)制
document.writeln(Number("070",8));
document.writeln(parseInt("070",8));
document.writeln(parseFloat("070",8));
70 56 70
只有parseInt明白了要做什么戏售。
所以要強(qiáng)轉(zhuǎn)數(shù)制侨核,還是要嚴(yán)格寫法。
- 明確告訴ECMA,我丟給你的是一個(gè)數(shù)值灌灾,而不是字符串搓译,我要你進(jìn)行數(shù)制轉(zhuǎn)換,而不要去嘗試從中提取數(shù)值锋喜。
document.writeln(Number(070));
document.writeln(parseInt(070));
document.writeln(parseFloat(070));
56 56 56
養(yǎng)成一個(gè)良好的書寫習(xí)慣些己,可以避免不少莫名其妙的bug豌鸡。
一家之言,歡迎斧正段标!