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

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

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

一、typeof

typeof 操作符返回一個字符串,表示未經計算的操作數的類型
使用方法如下:

typeof operand
typeof(operand)

operand表示對象或原始值的表達式,其類型將被返回
舉個例子

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個都是基礎數據類型。雖然typeof null為object,但這只是 JavaScript 存在的一個悠久 Bug,不代表null 就是引用數據類型,并且null 本身也不是對象

所以,null 在 typeof 之后返回的是有問題的結果,不能作為判斷null的方法。如果你需要在 if 語句中判斷是否為 null,直接通過===null來判斷就好

同時,可以發(fā)現引用類型數據,用typeof來判斷的話,除了function會被識別出來之外,其余的都輸出object
如果我們想要判斷一個變量是否存在,可以使用typeof:(不能使用if(a), 若a未聲明,則報錯)

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

二、instanceof

instanceof 運算符用于檢測構造函數的 prototype 屬性是否出現在某個實例對象的原型鏈上
使用如下:

object instanceof constructor

object為實例對象,constructor為構造函數
構造函數通過new可以實例對象,instanceof 能判斷這個對象是否是之前那個構造函數生成的對象

// 定義構建函數
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

關于instanceof的實現原理,可以參考下面:

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

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

三、區(qū)別

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

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

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

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

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

Object.prototype.toString({})       // "[object Object]"
Object.prototype.toString.call({})  // 同上結果,加上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的基本用法,下面就實現一個全局通用的數據類型判斷方法

function getType(obj){
  let type  = typeof obj;
  if (type !== "object") {    // 先進行typeof判斷,如果是基礎數據類型,直接返回
    return type;
  }
  // 對于typeof返回結果是object的,再進行如下的判斷,正則返回結果
  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"首字母大寫,typeof null是object,需toString來判斷
getType(undefined)   // "undefined" typeof 直接返回
getType()            // "undefined" typeof 直接返回
getType(function(){}) // "function" typeof能判斷,因此首字母小寫
getType(/123/g)      //"RegExp" toString返回

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

相關文章

  • 微信小程序用戶授權最佳實踐指南

    微信小程序用戶授權最佳實踐指南

    這篇文章主要給大家介紹了關于微信小程序用戶授權最佳實踐的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • html5+CSS 實現禁止IOS長按復制粘貼功能

    html5+CSS 實現禁止IOS長按復制粘貼功能

    因為在移動端APP需要實現長按執(zhí)行別的事件,但是在iOS系統(tǒng)有默認的長按選擇復制粘貼。禁止在網上找了很多資料,下面小編給大家分享解決方案,一起看看吧
    2016-12-12
  • 使用iframe實現pdf文件預覽功能

    使用iframe實現pdf文件預覽功能

    這篇文章主要為大家詳細介紹了如何使用iframe實現pdf文件預覽功能,以及iframe預覽報錯問題和iframe未能加載PDF文檔,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-09-09
  • javascript實現圖片輪換動作方法

    javascript實現圖片輪換動作方法

    這篇文章主要介紹了javascript實現圖片輪換動作方法,文章通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 基于HTML+JavaScript實現中國象棋

    基于HTML+JavaScript實現中國象棋

    這篇文章主要為大家詳細介紹了如何利用HTML+CSS+JS實現中國象棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • js與applet相互調用的方法

    js與applet相互調用的方法

    這篇文章主要介紹了js與applet相互調用的方法,結合實例形式分析了js調用java的applet以及java調用js的實現技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • 微信小程序本地存儲增加有效期的方法

    微信小程序本地存儲增加有效期的方法

    這篇文章主要介紹了微信小程序本地存儲增加有效期的方法,這里通過一個簡單示例,展示如何設置有效期為1小時的本地存儲,首先將storage.js引入到app.js中,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2024-07-07
  • JavaScript中的Reflect對象詳解(ES6新特性)

    JavaScript中的Reflect對象詳解(ES6新特性)

    這篇文章主要介紹了JavaScript中的Reflect對象(ES6新特性)的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • JS中超越現實的匿名函數用法實例分析

    JS中超越現實的匿名函數用法實例分析

    這篇文章主要介紹了JS中超越現實的匿名函數用法,結合實例形式分析了javascript匿名函數定義、用法及相關操作注意事項,需要的朋友可以參考下
    2019-06-06
  • IE8 瀏覽器Cookie的處理

    IE8 瀏覽器Cookie的處理

    最近在修改重寫自己的簡歷程序,其中要使用皮膚切換和lightbox效果,在開發(fā)的工作中IE8,給我?guī)睃c麻煩。
    2009-01-01

最新評論