js中null,undefined,false,0,'',[],{}判斷方法

因為獲取到數(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
  1. 關(guān)系運算符 和 相等運算符 并不是一個類別的.

  2. 關(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ū)分就使用這個足夠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,184評論 0 13
  • 第三章 類型、值和變量 1、存取字符串、數(shù)字或布爾值的屬性時創(chuàng)建的臨時對象稱做包裝對象,它只是偶爾用來區(qū)分字符串值...
    坤少卡卡閱讀 649評論 0 1
  • 逆鱗第一次登場是在韓非的劍盒中,氣息非常強大,外從觀上看劍體已經(jīng)支離破碎,但它卻有強大的劍靈存在 在韓非遭遇刺殺時...
    今天方程式閱讀 907評論 0 0
  • 時間,就像一個小偷 悄無聲息地偷走了我們的青春 懵懵懂懂地 我們長大 直到有一天,偶然~ 翻開了塵封已久的相冊 發(fā)...
    撲通撲通那個夏天閱讀 227評論 4 10
  • 工作日的下午,電影院里的人三三兩兩,今天打算看《二十二》。作為一部紀錄片,99分鐘里沒有太多情節(jié),說一些自己感受深...
    yaparis閱讀 192評論 0 0