javascript中的typeof和instanceof

1.typeof

語法:typeof 變量

在javascript中伟众,我們經(jīng)常用typeof 變量方法來判斷一個變量的類型算灸,該方法返回值為 字符串蛤吓。

我們先看下面例子測試下

 var a = 34,
    b = 'adsfas',
    c = true,
    d = function () {
    },
    e = null,
    f,
    g = [34, 4, 3, 54],
    h={},
    i=Symbol(),
    j=new d();
console.log(typeof (a)); //"number"
console.log(typeof (b)); //"string"
console.log(typeof (c)); //"boolean"
console.log(typeof (d)); //"function"
console.log(typeof (e)); //"object"
console.log(typeof (f)); //"undefined"
console.log(typeof (g)); //"object"
console.log(typeof (h)); //"object"
console.log(typeof (i)); //"symbol"
console.log(typeof (j)); //"object"

我們會發(fā)現(xiàn):

  • typeof在判斷null充活、array硼砰、object以及函數(shù)實例(new + 函數(shù))時且蓬,得到的都是"object"。所以當我們在判斷這些數(shù)據(jù)類型時题翰,typeof并不能確定的告訴我們具體是哪種數(shù)據(jù)類型恶阴。由此引出instanceof

2.instanceof

語法:object instanceof constructor

object:要檢測的對象(一般為對象豹障,如果為基本類型冯事,雖然返回false,不過沒什么意義)

constructor:構(gòu)造函數(shù)

注:constructor必須是個構(gòu)造函數(shù)

  1. 如果是基本類型(如[] instanceof 1)會報錯 Uncaught TypeError: Right-hand side of 'instanceof' is not an object;即右側(cè)不是個對象
  2. 如果是引用類型(如 [] instanceod [])會報錯: Uncaught TypeError: Right-hand side of 'instanceof' is not callable;即右側(cè)不可調(diào)用

在javascript中血公,instanceof 運算符用來檢測 constructor.prototype 是否存在于參數(shù) object 的原型鏈上昵仅,該方法返回值為布爾值(true/false)。什么意思坞笙?從字面意思上看岩饼,instanceof跟原型鏈有關(guān),所有在解釋這句話之前薛夜,需要有js原型的知識籍茧,不懂的可以戳這js原型、原型鏈梯澜。

舉個例子:

console.log([] instanceof Array) // true
console.log([] instanceof Object) // true
console.log([] instanceof Function) // false

console.log({} instanceof Array) // false
console.log({} instanceof Object) // true
console.log({} instanceof Function) // false

上面例子寞冯,運行結(jié)果各不相同。我們來分別解釋下:

  1. [] instanceof Array===true晚伙,根據(jù)定義解釋吮龄,即判斷Array的原型是否在[]的原型鏈上,很明顯[].__proto__===Array.prototype,所以為true
  2. [] instanceof Object===true咆疗,根據(jù)定義解釋漓帚,即判斷Object的原型是否在[]的原型鏈上,因為[].__proto__===Array.prototype午磁,找不到會繼續(xù)往原型鏈找尝抖,所以應(yīng)該是找到[].__proto__.__proto__, 也就是Array.prototype.__proto__Object.prototype,所以為true
  3. [] instanceof Function===false,根據(jù)定義解釋迅皇,即判斷Function的原型是否在[]的原型鏈上,和上面第二點一樣昧辽,一直沿著原型鏈找,找不到繼續(xù)找登颓,當?shù)?code>Object.prototype還是找不到搅荞,繼續(xù)找,直到為null,因為Object.prototype.__proto__===null咕痛,所以為false

同理{} instanceof Object===true因為{}.__proto__===Object.prototype,其他兩個就不解釋了痢甘,和上面一樣,也是沿著原型鏈找暇检。我們可以用javascript模擬instanceOf

3.null和typeof产阱、instanceof的關(guān)系

直接看例子:

console.log(null instanceof Object); //false
console.log(typeof null); //'object'
console.log(null instanceof null); //報錯 Uncaught TypeError: Right-hand side of 'instanceof' is not an object
20190829160338.png

我們了解原型鏈的都知道,原型鏈的頂端就是null块仆。所以 null instanceof Object===false沒什么問題。但是typeof null結(jié)果為什么是'object'王暗,讓人以為null instanceof Object===true悔据。實際typeof null==='object'是一個歷史遺留下來的bug,本質(zhì)上null和object不是一個數(shù)據(jù)類型俗壹,null值并不是以O(shè)bject為原型創(chuàng)建出來的科汗,所以null instanceof Object===false

在 javascript 的最初版本中,使用的 32 位系統(tǒng)绷雏,為了性能考慮使用低位存儲了變量的類型信息:

  • 000:對象
  • 1:整數(shù)
  • 010:浮點數(shù)
  • 100:字符串
  • 110:布爾

有 2 個值比較特殊:

  • undefined:用 -(?2^30)表示头滔。
  • null:對應(yīng)機器碼的 NULL 指針,一般是全零

所以涎显,typeof 在判斷類型時候坤检,實際是根據(jù)上面的機器碼存儲信息來判斷的,所以 null 就出現(xiàn)問題了期吓,由于 null 的所有機器碼均為0早歇,因此直接被當做了對象來看待,實際本質(zhì)上null(實際上是基本類型)和object(引用類型)壓根不是同一個數(shù)據(jù)類型讨勤,null在javascript中表示尚未創(chuàng)建的對象(空對象)箭跳。所以:

typeof null === 'object';
null instanceof Object === false

因為null是原型鏈的頂端,所以其沒有原型對象潭千,所以null instanceof null會直接報錯谱姓。

4.null和{}

{}并不是一個完全空的對象,因為他的原型鏈上還有Object呢刨晴,而null就是完全空的對象屉来,啥也沒有,原型鏈也沒有割捅。所以奶躯,在js中,初始化一個空對象應(yīng)該用null亿驾,{}是初始化對象

5.使用javascript模擬instanceof

function instanceof(object,constructor){
    if(typeof object!='object'||object===null){
        return false
    }
    if(object===constructor.prototype){
        return true
    }else{
        return instanceof(object.__proto__,constructor)
    }
}

上面的代碼應(yīng)該很容易看懂嘹黔,我就不解釋了。

參考來源:
typeof與instanceof區(qū)別
js instanceof 疑惑?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市儡蔓,隨后出現(xiàn)的幾起案子郭蕉,更是在濱河造成了極大的恐慌,老刑警劉巖喂江,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件召锈,死亡現(xiàn)場離奇詭異,居然都是意外死亡获询,警方通過查閱死者的電腦和手機涨岁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吉嚣,“玉大人梢薪,你說我怎么就攤上這事〕⒍撸” “怎么了秉撇?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秋泄。 經(jīng)常有香客問我琐馆,道長,這世上最難降的妖魔是什么恒序? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任瘦麸,我火速辦了婚禮,結(jié)果婚禮上奸焙,老公的妹妹穿的比我還像新娘瞎暑。我一直安慰自己,他們只是感情好与帆,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布了赌。 她就那樣靜靜地躺著,像睡著了一般玄糟。 火紅的嫁衣襯著肌膚如雪勿她。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天阵翎,我揣著相機與錄音逢并,去河邊找鬼灭必。 笑死睡互,一個胖子當著我的面吹牛柴罐,可吹牛的內(nèi)容都是我干的冗懦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼奸远,長吁一口氣:“原來是場噩夢啊……” “哼万俗!你這毒婦竟也來了璃吧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤俯树,失蹤者是張志新(化名)和其女友劉穎帘腹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體许饿,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡阳欲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了陋率。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片球化。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖翘贮,靈堂內(nèi)的尸體忽然破棺而出赊窥,到底是詐尸還是另有隱情,我是刑警寧澤狸页,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站扯再,受9級特大地震影響芍耘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熄阻,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一斋竞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秃殉,春花似錦坝初、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吏恭,卻和暖如春拗小,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背樱哼。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工哀九, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搅幅。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓阅束,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茄唐。 傳聞我的和親對象是個殘疾皇子息裸,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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