JavaScript 判斷空對(duì)象夺脾、空數(shù)組的方法

我們?cè)谂袛鄥?shù)是否為空時(shí),希望把null, undefined, {}, [],"" 這五類都判定為空茉继。

一咧叭、為什么判定空對(duì)象、空數(shù)據(jù)有點(diǎn)“難”烁竭?

首先菲茬,我們先看下下面的表格:

a 取非 !a 和自己比較 a===null/undefined... 描述 數(shù)據(jù)類型
null true true 空對(duì)象 Null
undefined true true 未定義對(duì)象 Undefined
0 true true 數(shù)值0 Number
"" true true 空字符串 String
[] false false 空數(shù)組 Array
{} false false 空對(duì)象 Object

從表格中,我們可以看出想要判斷是不是null, undefined , "", 0派撕,都比較容易婉弹, 非操作比較操作 都能實(shí)現(xiàn)。就是{}, []比較頑固终吼,兩種方法都無效镀赌。

二、判定空數(shù)組的方法

分析:所謂空數(shù)組衔峰,就是數(shù)組的長(zhǎng)度等于0佩脊。所以我們的難點(diǎn)就落在了怎么判斷一個(gè)參數(shù)的數(shù)據(jù)類型是數(shù)組了。
我們可以通過isPrototypeOf()方法實(shí)現(xiàn)垫卤。

var obj = [];
Array.prototype.isPrototypeOf(obj); // true

isPrototypeOf() 方法用于測(cè)試一個(gè)對(duì)象是否存在于另一個(gè)對(duì)象的原型鏈上威彰。即判斷 Array 是否存在于 obj 的原型鏈上。該方法屬于 ES3 標(biāo)準(zhǔn)穴肘,現(xiàn)代瀏覽器均支持歇盼,包括 IE。

所以评抚,完整的檢驗(yàn)空數(shù)組的表達(dá)式如下:

// 滿足以下判斷表達(dá)式的都是 空數(shù)組 []
Array.prototype.isPrototypeOf(obj) && obj.length === 0

三豹缀、判定空對(duì)象的方法

分析:和判斷空對(duì)象類似的,我們只要能驗(yàn)證這個(gè)對(duì)象的keys長(zhǎng)度是0慨代,那就是個(gè)空對(duì)象了邢笙。我們依舊可以通過isPrototypeOf()方法實(shí)現(xiàn)判斷一個(gè)數(shù)據(jù)是不是對(duì)象她肯。

var obj = {};
Object.prototype.isPrototypeOf(obj); // true

完整的檢驗(yàn)空對(duì)象的表達(dá)式如下:

// 滿足以下判斷表達(dá)式的都是 空對(duì)象
Object.prototype.isPrototypeOf(obj) && Object.keys(obj).length === 0

其中挡毅,Object.keys()方法會(huì)返回一個(gè)由給定對(duì)象的自身可枚舉屬性組成的數(shù)組,數(shù)組中屬性名的排列順序和使用 for...in 循環(huán)遍歷該對(duì)象時(shí)返回的順序一致(該方法屬于 ES5 標(biāo)準(zhǔn)赦役,IE9 以上和其它現(xiàn)代瀏覽器均支持)。
若要兼容IE9以下妇汗,可以用 for...in替代帘不,但要注意for...in 會(huì)將對(duì)象原型鏈上的屬性也枚舉出來,所以要借hasOwnProperty()方法來判斷是不是對(duì)象本身的屬性杨箭。

function hasKeys(obj){
    for(var key in obj) {
        if(obj.hasOwnProperty(key)) {
            return true;
        }
    }
}
var obj1 = {a:'aa',b:'bb'};
var obj2 = {};
console.log(hasKeys(obj1)); // true
console.log(hasKeys(obj2)); // undefined

但要注意:在JavaScript 中一切皆是對(duì)象寞焙,也就是說,Object 也存在于數(shù)組的原型鏈上互婿,因此在封裝校驗(yàn)方法時(shí)捣郊,數(shù)組需要先于對(duì)象檢驗(yàn)。

Array.prototype.isPrototypeOf([]); // true
Array.prototype.isPrototypeOf({}); // false

Object.prototype.isPrototypeOf([]); // true
Object.prototype.isPrototypeOf({}); // true

注意:isPrototypeOfinstanceof operator 是不一樣的慈参。在表達(dá)式 obj instanceof AFunction 中模她,檢測(cè)的是 AFunction.prototype 是否在obj 的原型鏈中,而不是檢測(cè) AFunction 自身懂牧。

四侈净、一個(gè)判斷參數(shù)為空的函數(shù)封裝

結(jié)合上面的空對(duì)象、空數(shù)組檢測(cè)方法僧凤,我們可以封裝一個(gè)判斷參數(shù)為空的函數(shù)畜侦。

function isEmpty(a){
            if (a === "") return true; //檢驗(yàn)空字符串
            if (a === "null") return true; //檢驗(yàn)字符串類型的null
            if (a === "undefined") return true; //檢驗(yàn)字符串類型的 undefined
            if (!a && a !== 0 && a !=="") return true; //檢驗(yàn) undefined 和 null           
            if (Array.prototype.isPrototypeOf(a) && a.length === 0 ) return true; //檢驗(yàn)空數(shù)組
            if (Object.prototype.isPrototypeOf(a) && Object.keys(a).length === 0 ) return true;  //檢驗(yàn)空對(duì)象
            return false;
        }

小小Tips:

1. 一個(gè)討巧判斷空數(shù)組、空對(duì)象的方法:

var item = [];
console.log(JSON.stringify(item) === '[]'); // true
var item = {};
console.log(JSON.stringify(item) === '{}');// true

2. null, undefined, {}, [],"" , 0在非嚴(yán)格等于(即兩個(gè)等號(hào)時(shí)==)情況下躯保,他們互有“幫派”旋膳。

1)null, undefined為一組。

console.log(null == undefined); // true

2)[], "" , 0為一組途事。

console.log("" == 0); // true
console.log("" == []); // true
console.log(0 == []); // true

// 但不要混淆验懊,空數(shù)組不等于空數(shù)組
console.log([] == []); // false

所以在做判斷的時(shí)候,嚴(yán)謹(jǐn)點(diǎn)要用嚴(yán)格等于===尸变。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末义图,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子召烂,更是在濱河造成了極大的恐慌碱工,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奏夫,死亡現(xiàn)場(chǎng)離奇詭異怕篷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)酗昼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門廊谓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人麻削,你說我怎么就攤上這事蒸痹√蚴荆” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵电抚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我竖共,道長(zhǎng)蝙叛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任公给,我火速辦了婚禮借帘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淌铐。我一直安慰自己肺然,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布腿准。 她就那樣靜靜地躺著际起,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吐葱。 梳的紋絲不亂的頭發(fā)上街望,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音弟跑,去河邊找鬼灾前。 笑死,一個(gè)胖子當(dāng)著我的面吹牛孟辑,可吹牛的內(nèi)容都是我干的哎甲。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼饲嗽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼炭玫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起貌虾,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤础嫡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后酝惧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榴鼎,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年晚唇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巫财。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哩陕,死狀恐怖平项,靈堂內(nèi)的尸體忽然破棺而出赫舒,到底是詐尸還是另有隱情,我是刑警寧澤闽瓢,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布接癌,位于F島的核電站,受9級(jí)特大地震影響扣讼,放射性物質(zhì)發(fā)生泄漏缺猛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一椭符、第九天 我趴在偏房一處隱蔽的房頂上張望荔燎。 院中可真熱鬧,春花似錦销钝、人聲如沸有咨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)座享。三九已至,卻和暖如春似忧,著一層夾襖步出監(jiān)牢的瞬間征讲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工橡娄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诗箍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓挽唉,卻偏偏與公主長(zhǎng)得像滤祖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓶籽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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