亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

菜鳥(niǎo)也能搞懂js中typeof與instanceof區(qū)別

 更新時(shí)間:2021年09月14日 09:39:10   作者:artist  
instanceof和typeof是兩個(gè)運(yùn)算符,在程序設(shè)計(jì)中用到,常用來(lái)判斷一個(gè)變量是否為空,或者是什么類型的,本文就來(lái)介紹一下typeof與instanceof區(qū)別,感興趣的可以了解一下

一、typeof

typeof 操作符返回一個(gè)字符串,表示未經(jīng)計(jì)算的操作數(shù)的類型
使用方法如下:

typeof operand
typeof(operand)

operand表示對(duì)象或原始值的表達(dá)式,其類型將被返回
舉個(gè)例子

typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
typeof null // 'object'
typeof [] // 'object'
typeof {} // 'object'
typeof console // 'object'
typeof console.log // 'function'

從上面例子,前6個(gè)都是基礎(chǔ)數(shù)據(jù)類型。雖然typeof null為object,但這只是 JavaScript 存在的一個(gè)悠久 Bug,不代表null 就是引用數(shù)據(jù)類型,并且null 本身也不是對(duì)象

所以,null 在 typeof 之后返回的是有問(wèn)題的結(jié)果,不能作為判斷null的方法。如果你需要在 if 語(yǔ)句中判斷是否為 null,直接通過(guò)===null來(lái)判斷就好

同時(shí),可以發(fā)現(xiàn)引用類型數(shù)據(jù),用typeof來(lái)判斷的話,除了function會(huì)被識(shí)別出來(lái)之外,其余的都輸出object
如果我們想要判斷一個(gè)變量是否存在,可以使用typeof:(不能使用if(a), 若a未聲明,則報(bào)錯(cuò))

if(typeof a != 'undefined'){
    //變量存在
}

二、instanceof

instanceof 運(yùn)算符用于檢測(cè)構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象的原型鏈上
使用如下:

object instanceof constructor

object為實(shí)例對(duì)象,constructor為構(gòu)造函數(shù)
構(gòu)造函數(shù)通過(guò)new可以實(shí)例對(duì)象,instanceof 能判斷這個(gè)對(duì)象是否是之前那個(gè)構(gòu)造函數(shù)生成的對(duì)象

// 定義構(gòu)建函數(shù)
let Car = function() {}
let benz = new Car()
benz instanceof Car // true
let car = new String('xxx')
car instanceof String // true
let str = 'xxx'
str instanceof String // false

關(guān)于instanceof的實(shí)現(xiàn)原理,可以參考下面:

function myInstanceof(left, right) {
    // 這里先用typeof來(lái)判斷基礎(chǔ)數(shù)據(jù)類型,如果是,直接返回false
    if(typeof left !== 'object' || left === null) return false;
    // getProtypeOf是Object對(duì)象自帶的API,能夠拿到參數(shù)的原型對(duì)象
    let proto = Object.getPrototypeOf(left);
    while(true) {                  
        if(proto === null) return false;
        if(proto === right.prototype) return true;//找到相同原型對(duì)象,返回true
        proto = Object.getPrototypeof(proto);
    }
}

也就是順著原型鏈去找,直到找到相同的原型對(duì)象,返回true,否則為false

三、區(qū)別

typeof與instanceof都是判斷數(shù)據(jù)類型的方法,區(qū)別如下:

  • typeof會(huì)返回一個(gè)變量的基本類型,instanceof返回的是一個(gè)布爾值
  • instanceof 可以準(zhǔn)確地判斷復(fù)雜引用數(shù)據(jù)類型,但是不能正確判斷基礎(chǔ)數(shù)據(jù)類型
  • 而 typeof 也存在弊端,它雖然可以判斷基礎(chǔ)數(shù)據(jù)類型(null 除外),但是引用數(shù)據(jù)類型中,除了 function 類型以外,其他的也無(wú)法判斷

1.對(duì)于對(duì)象、數(shù)組、null 返回的值是 object 。比如typeof(window),typeof(document),typeof(null)返回的值都是object。
2.對(duì)于函數(shù)類型,返回的值是 function。比如:typeof(eval),typeof(Date)返回的值都是function。

可以看到,上述兩種方法都有弊端,并不能滿足所有場(chǎng)景的需求

如果需要通用檢測(cè)數(shù)據(jù)類型,可以采用Object.prototype.toString,調(diào)用該方法,統(tǒng)一返回格式“[object Xxx]” 的字符串
如下

Object.prototype.toString({})       // "[object Object]"
Object.prototype.toString.call({})  // 同上結(jié)果,加上call也ok
Object.prototype.toString.call(1)    // "[object Number]"
Object.prototype.toString.call('1')  // "[object String]"
Object.prototype.toString.call(true)  // "[object Boolean]"
Object.prototype.toString.call(function(){})  // "[object Function]"
Object.prototype.toString.call(null)   //"[object Null]"
Object.prototype.toString.call(undefined) //"[object Undefined]"
Object.prototype.toString.call(/123/g)    //"[object RegExp]"
Object.prototype.toString.call(new Date()) //"[object Date]"
Object.prototype.toString.call([])       //"[object Array]"
Object.prototype.toString.call(document)  //"[object HTMLDocument]"
Object.prototype.toString.call(window)   //"[object Window]"

了解了toString的基本用法,下面就實(shí)現(xiàn)一個(gè)全局通用的數(shù)據(jù)類型判斷方法

function getType(obj){
  let type  = typeof obj;
  if (type !== "object") {    // 先進(jìn)行typeof判斷,如果是基礎(chǔ)數(shù)據(jù)類型,直接返回
    return type;
  }
  // 對(duì)于typeof返回結(jié)果是object的,再進(jìn)行如下的判斷,正則返回結(jié)果
  return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1'); 
}

使用如下

getType([])     // "Array" typeof []是object,因此toString返回
getType('123')  // "string" typeof 直接返回
getType(window) // "Window" toString返回
getType(null)   // "Null"首字母大寫(xiě),typeof null是object,需toString來(lái)判斷
getType(undefined)   // "undefined" typeof 直接返回
getType()            // "undefined" typeof 直接返回
getType(function(){}) // "function" typeof能判斷,因此首字母小寫(xiě)
getType(/123/g)      //"RegExp" toString返回

到此這篇關(guān)于菜鳥(niǎo)也能搞懂js中typeof與instanceof區(qū)別的文章就介紹到這了,更多相關(guān)js中typeof與instanceof內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • React?diff算法面試考點(diǎn)超詳細(xì)講解

    React?diff算法面試考點(diǎn)超詳細(xì)講解

    渲染真實(shí)DOM的開(kāi)銷很大,有時(shí)候我們修改了某個(gè)數(shù)據(jù),直接渲染到真實(shí)dom上會(huì)引起整個(gè)dom樹(shù)的重繪和重排。我們希望只更新我們修改的那一小塊dom,而不是整個(gè)dom,diff算法就幫我們實(shí)現(xiàn)了這點(diǎn)。diff算法的本質(zhì)就是:找出兩個(gè)對(duì)象之間的差異,目的是盡可能做到節(jié)點(diǎn)復(fù)用
    2022-12-12
  • JavaScript避免內(nèi)存泄露及內(nèi)存管理技巧

    JavaScript避免內(nèi)存泄露及內(nèi)存管理技巧

    這篇文章主要介紹了JavaScript避免內(nèi)存泄露及內(nèi)存管理技巧,主要包括了delete應(yīng)用、閉包、DOM泄露、Timers計(jì)(定)時(shí)器泄露等等,需要的朋友可以參考下
    2014-09-09
  • 純js實(shí)現(xiàn)手風(fēng)琴效果

    純js實(shí)現(xiàn)手風(fēng)琴效果

    這篇文章主要介紹了純js+html制作手風(fēng)琴和純css+html制作手風(fēng)琴兩種效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 小程序如何定位所在城市及發(fā)起周邊搜索

    小程序如何定位所在城市及發(fā)起周邊搜索

    這篇文章主要介紹了小程序如何定位所在城市及發(fā)起周邊搜索,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • javascript實(shí)現(xiàn)貪吃蛇小游戲思路

    javascript實(shí)現(xiàn)貪吃蛇小游戲思路

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)貪吃蛇思路小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • js中各種時(shí)間日期格式之間的轉(zhuǎn)換代碼示例

    js中各種時(shí)間日期格式之間的轉(zhuǎn)換代碼示例

    這篇文章主要介紹了js中各種時(shí)間日期格式之間轉(zhuǎn)換的相關(guān)資料,還有獲取今天的年月日和計(jì)算兩個(gè)日期之間的相差天數(shù)的方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • JS帶你深入領(lǐng)略Proxy的世界

    JS帶你深入領(lǐng)略Proxy的世界

    Proxy是es2015 標(biāo)準(zhǔn)規(guī)范加入的語(yǔ)法,很可能你只是聽(tīng)說(shuō)過(guò),但并沒(méi)有用過(guò),畢竟考慮到兼容的問(wèn)題,不能輕易地使用Proxy特性。但現(xiàn)在隨著各個(gè)瀏覽器的更新迭代,Proxy的支持度也越來(lái)越高:而且使用Proxy進(jìn)行代理和劫持,也漸漸成為了趨勢(shì)。
    2021-05-05
  • JS中的const命令你真懂它嗎

    JS中的const命令你真懂它嗎

    這篇文章主要介紹了JS中的const命令你真懂它嗎,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • js網(wǎng)頁(yè)滾動(dòng)條滾動(dòng)事件實(shí)例分析

    js網(wǎng)頁(yè)滾動(dòng)條滾動(dòng)事件實(shí)例分析

    這篇文章主要介紹了js網(wǎng)頁(yè)滾動(dòng)條滾動(dòng)事件的用法,實(shí)例分析了javascript中window.onscroll監(jiān)控滾動(dòng)條滾動(dòng)事件的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • Javascript腳本實(shí)現(xiàn)靜態(tài)網(wǎng)頁(yè)加密實(shí)例代碼

    Javascript腳本實(shí)現(xiàn)靜態(tài)網(wǎng)頁(yè)加密實(shí)例代碼

    這篇文章介紹了Javascript腳本實(shí)現(xiàn)靜態(tài)網(wǎng)頁(yè)加密實(shí)例代碼,有需要的朋友可以參考一下
    2013-11-11

最新評(píng)論