因為獲取到數(shù)據(jù)的不確定性,常常會導(dǎo)致一些異常情況,使得頁面報錯,往往要兼容這些異常數(shù)據(jù),那么前端的包容性就很重要了。所以這里我對一些異常的數(shù)據(jù)進行了整理。
const datas = [undefined,null,0,'',false,[],{}]
let param1 = '類型'
let param2 = 'JSON字符串'
let param3 = '轉(zhuǎn)為數(shù)字類型'
let param4 = '非'
let param5 = '與非比較'
console.log(datas) // [undefined, null, 0, "", false, Array(0), {…}]
_.map(datas || [], data=>{
param1+=`${typeof (data)},`
param2+=`${JSON.stringify(data)},`
param3+=`${Number(data)},`
param4+=`${!data},`
param5+=`${data==!data},`
})
console.log(param1) // 類型 undefined,object,number,string,boolean,object,object,
console.log(param2) // JSON字符串undefined,null,0,"",false,[],{},
console.log(param3) // 轉(zhuǎn)為數(shù)字類型NaN,0,0,0,0,0,NaN,
console.log(param4) // 非true,true,true,true,true,false,false,
console.log(param5) // 與非比較false,false,false,false,false,true,false,
1.數(shù)據(jù)類型
- 數(shù)據(jù)的類型包括原始類型(基本類型)和引用類型。
- 原始類型(基本類型)包括字符串、數(shù)字、布爾、Null、Undefined,按值訪問,可以操作保存在變量中實際的值。原始類型匯總中null和undefined比較特殊。
- 引用類型包括數(shù)組、對象,引用類型的值是保存在內(nèi)存中的對象。
-
比較特殊的是typeof null返回“object”。
歷史原因,規(guī)范嘗試修改typeof null返回“null”修改完大量網(wǎng)站無法訪問,為了兼容,或者說歷史原因返回"object"。
typeof對基本類型和函數(shù)對象很方便,但是其他類型就沒辦法了。
判斷一個對象是不是數(shù)組?用typeof返回“object”。對對象的判斷常用instanceof。
2.JSON字符串
這里返回的每一個JSON字符串都是它本身的JSON字符,唯一的,單獨判斷的時候,我經(jīng)常采用這種方法。
3.數(shù)字類型
這里undefined和空對象{}是NAN,而空數(shù)組為0。
- 但是,將空數(shù)組與true進行比較時,結(jié)果是false。因為,任意值與布爾值進行比較的時候都會轉(zhuǎn)換為數(shù)值進行比較(我一直以為所有的比較都會轉(zhuǎn)化為簡單的類型比較,這里比較特殊?),布爾值true為1, false為0,空數(shù)組轉(zhuǎn)換為數(shù)字的話是0,所以二者并不相等。
- 如果將兩個數(shù)組進行比較, 返回值是false, 因為二者是不同的兩個對象。
- new Array(1)同樣因為雖然長度為1,但值為undefined,轉(zhuǎn)換為數(shù)字仍未0。
console.log(a == true) // false
console.log([] == []) // false
console.log(new Array(1) == false)) // true
4.非的布爾值
引用類型轉(zhuǎn)換了Boolean均為true,所以空數(shù)組和空對象進行布爾轉(zhuǎn)換時均轉(zhuǎn)換為true。
5.與非比較
對于空數(shù)組[]而言,等式右邊的空數(shù)組被轉(zhuǎn)換為了一個布爾值,空數(shù)組是true,取反是false;數(shù)組左邊與布爾值進行比較(任意值與布爾值進行比較的時候都會轉(zhuǎn)換為數(shù)值進行比較),需要將二者都轉(zhuǎn)換為數(shù)數(shù)字,左側(cè)空數(shù)組轉(zhuǎn)換為0, 右側(cè)相當于false轉(zhuǎn)換為數(shù)字,也是0, 所以二者相等。但是如果是全等比較則不相等,因為不會發(fā)生類型轉(zhuǎn)換。
一、單獨判斷
1.null
和數(shù)字運算時,10 + null結(jié)果為:10;10 + undefined結(jié)果為:NaN。
let a =null
JSON.stringify(a)=='null' // true
關(guān)系運算符 和 相等運算符 并不是一個類別的.
關(guān)系運算符,在設(shè)計上總是需要運算元嘗試轉(zhuǎn)為一個number,而相等運算符在設(shè)計上,則沒有這方面的考慮.
null > 0 // null 嘗試轉(zhuǎn)型為number , 則為0 . 所以結(jié)果為 false,
null >= 0 // null 嘗試轉(zhuǎn)為number ,則為0 , 結(jié)果為 true.
null == 0 // null在設(shè)計上,在此處不嘗試轉(zhuǎn)型. 所以 結(jié)果為false.
2.undefined
undefined表示"缺少值",就是此處應(yīng)該有一個值,但是還沒有定義。典型用法是:
(1)變量被聲明了,但沒有賦值時,就等于undefined。
(2) 調(diào)用函數(shù)時,應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于undefined。
(3)對象沒有賦值的屬性,該屬性的值為undefined。
(4)函數(shù)沒有返回值時,默認返回undefined。
null是一個表示"無"的對象,轉(zhuǎn)為數(shù)值時為0;undefined是一個表示"無"的原始值,轉(zhuǎn)為數(shù)值時為NaN。
3.0
0與一些虛值的比較:
console.log(0 == ''); //true
console.log(0 == false); //true
console.log(0==[]); //true
console.log(0==NaN);//false
console.log(0==undefined);//false
console.log(0==null);//false
console.log(0=={});//false
console.log(null == undefined); //true
console.log(false == null); //false
console.log(false == undefined);//false
4.“”
“”與一些虛值的比較:
console.log('' == false); //true
console.log(''==[]);//true
console.log(''==undefined);//false
console.log(''==null);//false
console.log(''==NAN);//false
console.log(''=={});//false
5.判斷undefined、null與NaN:
var tmp = null;
if (!tmp)
{
alert("null or undefined or NaN");
}
提示:一般不那么區(qū)分就使用這個足夠。