1.問題
當(dāng)然了芳悲,這里的注釋部分可以不看氛堕,因?yàn)槲野l(fā)現(xiàn)有錯(cuò)誤=馏臭。=
問題來了,false 讼稚、null 位喂、 0 、 "" 乱灵、undefined 都很好判斷塑崖,直接使用===即可,但是 NaN 是不能用===來判斷的痛倚,因?yàn)椋?/p>
NaN === NaN;
false //永遠(yuǎn)返回 false 规婆, NaN 不等于其他任何值,包括它本身。
如果不能使用 === 來檢測(cè)NaN抒蚜,那該使用什么呢掘鄙?
2.isNaN函數(shù)(不夠嚴(yán)謹(jǐn))
為什么說isNaN不夠嚴(yán)謹(jǐn),拿圖片中的例子打比方
var a = [];
for(var i=0;i<arr.length;i++){
a.push(arr[i])
}
console.log(a);
這個(gè)時(shí)候數(shù)組 a 是:
"100px,NaN,,-98765,34,-2,0,300,,function () {alert(1);},,[object HTMLDocument],,true,NaN,23.45元,5,NaN,function () {alert(3);}"
可以看到嗡髓,為 NaN 的值有三個(gè)操漠,這時(shí),我們?cè)囋囉?isNaN() 來判斷下:
var b = [];
if( isNaN(arr[i]) ){
b.push(i);
}
這個(gè)時(shí)候數(shù)組 b 是:
"0,1,8,9,11,14,15,17,18"
這跟我們之前看到的只有3個(gè) NaN 差距也太大了吧~
因?yàn)?isNaN() 存在問題饿这,
它總會(huì)隱式的將參數(shù)中的值轉(zhuǎn)換成數(shù)字再做判斷浊伙,這樣就在判斷很多明顯不是 NaN 的值的時(shí)候也返回了 true ,任意的字符串使用 isNaN 都會(huì)返回 true 长捧,這樣就無法判斷真正的 isNaN 了嚣鄙。
3.解決方法
- 在使用 isNaN() 之前先檢查一下這個(gè)值是不是數(shù)字類型,這樣就避免了隱式轉(zhuǎn)換的問題:
var c = [];
if(typeof arr[i] === "number" && isNaN(arr[i])){
c.push(i);
}
這個(gè)時(shí)候數(shù)組c是:
"1,14,17"
這樣就沒有問題了串结。