JavaScript 類型檢測

JavaScript 類型檢測

本文介紹JavaScript的幾種類型檢測的方法,以及其各自的適用范圍亿胸。

JavaScript 的數(shù)據(jù)類型

JavaScript中的數(shù)據(jù)類型有null冕广、undefined、布爾值、字符串慧妄、數(shù)字、對象纫溃,這6種數(shù)據(jù)類型腰涧,其中前五種是基本數(shù)據(jù)類型,對象是復(fù)雜數(shù)據(jù)類型紊浩。

JavaScript中檢測類型有如下幾種方法:

  1. typeof
  2. instanceof
  3. constructor
  4. duck type (鴨子類型)

typeof

typeof返回字符串窖铡,適用于函數(shù)對象基本類型的檢測(注:遇null失效),各種類型的返回值如下:

代碼 結(jié)果
typeof 1 "number"
typeof true "boolean"
typeof function "function"
typeof [3,4,5] "object"
typeof new Object() "object"
typeof NaN "number"
typeof undefined "undefined"
typeof null "object"(null被認為是一個空的對象引用)

不適用的范圍:

  1. typeof null返回"object"坊谁,所以不適合判斷null

如需判斷某個對象是否是null费彼,可以使用obj === null

instanceof

instanceof 是一個二元操作符,左邊是要判斷的對象口芍,右面是函數(shù)對象或者構(gòu)造器

instanceof 是基于原型鏈進行判斷箍铲,判斷左邊的原型鏈上是否有右邊的類型(和Java的intanceof類型)

function Dog() {}  
  
  
// Dog繼承于Animal  
Dog.prototype = new Animal();  
Dog.prototype.constructor = Dog;  
  
  
var dog = new Dog();  
console.log(dog instanceof Dog); // true dog直接用Dog初始化,所以為真  
  
  
var cat = new Animal();  
console.log(cat instanceof Animal); // true cat直接用Animal初始化鬓椭,所以為真  
  
  
console.log(cat instanceof Dog); //false   
console.log(dog instanceof Animal); //true  

在判斷dog是否是Animal類型時颠猴,dog對象有一個原型_proto_,該原型會指向其構(gòu)造器 Dog 的_proto_小染,但是Animal不等于Dog翘瓮,所以該原型鏈會繼續(xù)向上查找,Dog的_proto_指向了Animal裤翩,所以最終dog instanceof Animal 返回true

不適用的范圍:在多窗口和多框架的子頁面的web應(yīng)用中兼容性不好资盅。

原因:在兩個不同框架頁面創(chuàng)建的兩個相同的對象繼承與兩個相同但互相獨立的原型對象(例如:創(chuàng)建兩個數(shù)組),其中一個框架頁面中的數(shù)組不是另一個框架頁面中的Array()構(gòu)造函數(shù)的實例,instanceof 運算結(jié)果返回false呵扛。

constructor

不適用范圍:

  1. 不適合判斷null和undefined每庆,因為沒有contructor屬性
  2. contructor可能被改寫
  3. 和instanceof類型,在多窗口和多框架下無法工作
  4. 并非所有的對象都包含contructor 屬性

contructor的使用如下:

代碼 結(jié)果
var x=1; x.constructor Number
var x=true; x.constructor Boolean
var x = function(){};x.constructor Function
var x='string';x.constructor String

注意:nullundefined沒有constructor

duck type

不要關(guān)注對象的類是什么今穿,而是關(guān)注對象能做什么缤灵。

例如,我們在判斷一個對象是否是Array的實例的時候荣赶,可以通過判斷對象是否含有一個非負的length屬性來判斷凤价,這是一個必要非充分條件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拔创,一起剝皮案震驚了整個濱河市利诺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剩燥,老刑警劉巖慢逾,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異灭红,居然都是意外死亡侣滩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門变擒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來君珠,“玉大人,你說我怎么就攤上這事娇斑〔咛恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵毫缆,是天一觀的道長唯竹。 經(jīng)常有香客問我,道長苦丁,這世上最難降的妖魔是什么浸颓? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮旺拉,結(jié)果婚禮上产上,老公的妹妹穿的比我還像新娘。我一直安慰自己蛾狗,他們只是感情好蒂秘,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淘太,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒲牧,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天撇贺,我揣著相機與錄音,去河邊找鬼冰抢。 笑死松嘶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挎扰。 我是一名探鬼主播翠订,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼遵倦!你這毒婦竟也來了尽超?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梧躺,失蹤者是張志新(化名)和其女友劉穎似谁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掠哥,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡巩踏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了续搀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塞琼。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖禁舷,靈堂內(nèi)的尸體忽然破棺而出彪杉,到底是詐尸還是另有隱情,我是刑警寧澤榛了,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布在讶,位于F島的核電站,受9級特大地震影響霜大,放射性物質(zhì)發(fā)生泄漏构哺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一战坤、第九天 我趴在偏房一處隱蔽的房頂上張望曙强。 院中可真熱鬧,春花似錦途茫、人聲如沸碟嘴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娜扇。三九已至错沃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雀瓢,已是汗流浹背枢析。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刃麸,地道東北人醒叁。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像泊业,于是被迫代替她去往敵國和親把沼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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

  • 本篇介紹一下如何檢測JavaScript各種類型吁伺。 5種原始類型 對象 Function Array 屬性 5種原...
    張歆琳閱讀 609評論 0 7
  • typeof 適合基本類型和函數(shù)類型饮睬,遇到null失效 instanceof 判斷左邊的原型鏈上是否有右邊構(gòu)造函數(shù)...
    yyyzhen閱讀 213評論 0 0
  • 參考視頻:JavaScript類型檢測-慕課網(wǎng) 可以用以下5種來進行類型檢測 typeof 適用場景: 檢測基礎(chǔ)類...
    waka閱讀 317評論 2 0
  • 既然是一個弱類型的語言,那么如何檢測類型呢? 1.typeof typeof會返回一個基礎(chǔ)數(shù)據(jù)類型或?qū)ο蟮淖址?..
    RainFool閱讀 199評論 0 0
  • 面向?qū)ο蟮腏avaScript 1.1 動態(tài)類型語言和鴨子類型 按照數(shù)據(jù)類型箱蝠,編程語言可以分為兩大類:靜態(tài)類型語言...
    梁同學(xué)de自言自語閱讀 2,133評論 0 11