js數(shù)據(jù)類型檢測

javascript一共有6種數(shù)據(jù)類型怠硼,其中包含5種基本類型:Undefined鬼贱、Null、Boolean香璃、Number这难、String,和一中復雜類型Object葡秒。在實際運用中姻乓,有時需要判斷是什么類型,判斷是否符合要求或根據(jù)不同的類型做出不同的類型眯牧。

一蹋岩、typeof操作符 — 用于識別正在處理的對象的類型

這個操作符可能返回"undefined"、"boolean"炸站、"number"星澳、"string"、"object"旱易、"function"
<b>注意:typeof(null) == "object"禁偎,null被當做是一個空對象。對正則表達式調(diào)用typeof,safari5及以前的版本阀坏、chrome7及以前的版本會返回"function"如暖,其他瀏覽器會返回"object"。</b>

二忌堂、instanceof — 用于判斷一個變量是否某個對象的實例

typeof是檢測基本類型的得力助手盒至,而instanceof適合檢測引用類型。
variable instanceof Object ,如果是引用類型都返回true,如果是基本類型都返回false士修。
instanceof可以檢測Object枷遂、Function、Array棋嘲、RegExp等酒唉。

三、常用應用場景

(一)檢測數(shù)組沸移、對象

1.all改變toString的this引用為待檢測的對象

function isArray(obj) { 
    return Object.prototype.toString.call(obj) === '[object Array]';
}

ECMA-262 寫道
Object.prototype.toString( ) When the toString method is called, the following steps are taken:

  1. Get the [[Class]] property of this object.
  2. Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.
  3. Return Result (2)
    上面的規(guī)范定義了Object.prototype.toString的行為:首先痪伦,取得對象的一個內(nèi)部屬性[[Class]]侄榴,然后依據(jù)這個屬性,返回一個類似于"[object Array]"的字符串作為結果(看過ECMA標準的應該都知道网沾,[[]]用來表示語言內(nèi)部用到的癞蚕、外部不可直接訪問的屬性,稱為“內(nèi)部屬性”)辉哥。利用這個方法桦山,再配合call,我們可以取得任何對象的內(nèi)部屬性[[Class]]证薇,然后把類型檢測轉化為字符串比較度苔,以達到我們的目的。還是先來看看在ECMA標準中Array的描述吧:

ECMA-262 寫道
new Array([ item0[, item1 [,…]]])
The [[Class]] property of the newly constructed object is set to “Array”.
于是利用這點浑度,第三種方法登場了寇窑。
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
} call改變toString的this引用為待檢測的對象,返回此對象的字符串表示箩张,然后對比此字符串是否是'[object Array]'甩骏,以判斷其是否是Array的實例。也許你要問了先慷,為什么不直接o.toString()饮笛?嗯,雖然Array繼承自Object论熙,也會有toString方法福青,但是這個方法有可能會被改寫而達不到我們的要求,而Object.prototype則是老虎的屁股脓诡,很少有人敢去碰它的无午,所以能一定程度保證其“純潔性”:)
這個方法很好的解決了跨frame對象構建的問題,經(jīng)過測試祝谚,各大瀏覽器兼容性也很好宪迟,可以放心使用。一個好消息是交惯,很多框架次泽,比如jQuery、Base2等等席爽,都計劃借鑒此方法以實現(xiàn)某些特殊的意荤,比如數(shù)組、正則表達式等對象的類型判定只锻,不用我們自己寫了玖像。

2.使用typeof加length屬性

var arr = [1,2,3,4,5];var obj = {};
function getDataType(o){
    if(typeof o == 'object'){    
        if( typeof o.length == 'number' ){
            return 'Array'; 
        }else{
            return 'Object';    
        }
    }else{
        return 'param is no object type';
    }
}

3.使用instanceof

function getDataType(){
    if(o instanceof Array){
        return 'Array';
    }else if( o instanceof Object ){
        return 'Object';
    }else{
        return 'param is no object type';
    }
  }

這個方法在iframe中會有問題

var iframe = document.createElement('iframe'); 
document.body.appendChild(iframe);
xArray = window.frames[window.frames.length-1].Array;
var arr = new xArray("1","2","3","4","5");//這個寫法IE大哥下是不支持的,F(xiàn)F下才有 
alert(arr instanceof Array); // false 
alert(arr.constructor === Array); // false 
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炬藤,一起剝皮案震驚了整個濱河市御铃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沈矿,老刑警劉巖上真,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異羹膳,居然都是意外死亡睡互,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門陵像,熙熙樓的掌柜王于貴愁眉苦臉地迎上來就珠,“玉大人,你說我怎么就攤上這事醒颖∑拊酰” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵泞歉,是天一觀的道長逼侦。 經(jīng)常有香客問我,道長腰耙,這世上最難降的妖魔是什么榛丢? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮挺庞,結果婚禮上晰赞,老公的妹妹穿的比我還像新娘。我一直安慰自己选侨,他們只是感情好掖鱼,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侵俗,像睡著了一般锨用。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上隘谣,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天增拥,我揣著相機與錄音,去河邊找鬼寻歧。 笑死掌栅,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的码泛。 我是一名探鬼主播猾封,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼噪珊!你這毒婦竟也來了晌缘?” 一聲冷哼從身側響起齐莲,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磷箕,沒想到半個月后选酗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡岳枷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年芒填,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片空繁。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡殿衰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盛泡,到底是詐尸還是另有隱情闷祥,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布傲诵,位于F島的核電站蜀踏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏掰吕。R本人自食惡果不足惜果覆,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望殖熟。 院中可真熱鬧局待,春花似錦、人聲如沸菱属。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吏奸。三九已至,卻和暖如春豺型,著一層夾襖步出監(jiān)牢的瞬間赏陵,已是汗流浹背饼齿。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝙搔,地道東北人缕溉。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像吃型,于是被迫代替她去往敵國和親证鸥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

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

  • 前言 js 中的類型檢測也是很重要的一部分,所以說這篇文章我們就來講一下怎么對 JavaScript 中的基本數(shù)據(jù)...
    sunshine小小倩閱讀 475評論 1 3
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,233評論 0 4
  • ECMAScript關鍵字 delete do else finally function in instance...
    doudou2閱讀 721評論 0 0
  • 1枉层、typeof 用來檢測數(shù)據(jù)類型的運算符 typeof value ->返回值首先是一個字符串,其次里面包含了對...
    虎帥鍋閱讀 537評論 0 1
  • 4.1.4 檢測類型 要檢測一個變量是不是基本數(shù)據(jù)類型泉褐?第 3 章介紹的 typeof 操作符是最佳的工具。說得更...
    別過經(jīng)年閱讀 489評論 1 1