JavaScript中常見(jiàn)的類型判斷方法和區(qū)別詳解
typeof 操作符
typeof
操作符可以準(zhǔn)確地判斷除了 null
之外的原始類型,它返回一個(gè)表示數(shù)據(jù)類型的字符串。下面是一些例子:
typeof 42 // "number" typeof "hello" // "string" typeof true // "boolean" typeof undefined // "undefined"
需要注意的是,typeof null
返回 "object"
,這是 JavaScript 語(yǔ)言本身的一個(gè)歷史 Bug。因?yàn)樵趦?nèi)存中,typeof
是通過(guò)判斷變量的二進(jìn)制開(kāi)頭來(lái)判斷它的類型的,引用類型(除函數(shù)外)的開(kāi)頭都是三個(gè)0,所以返回"object"
,但剛好null
它的二進(jìn)制表示全為零,因此它被錯(cuò)誤判斷為對(duì)象。
instanceof 操作符
instanceof
操作符用于判斷對(duì)象是否是某個(gè)構(gòu)造函數(shù)創(chuàng)建的實(shí)例,它只能用于判斷引用類型(因?yàn)樵碱愋蜎](méi)有原型),所以原始類型調(diào)用會(huì)返回false。它通過(guò)原型鏈查找來(lái)判斷,原理是a的隱式原型是否等于b的顯示原型,下面是一個(gè)例子:
function Person(name) { this.name = name; } var person1 = new Person('Alice'); person1 instanceof Person; // true
需要注意的是,引用類型的實(shí)例對(duì)象除了被判斷為本身的引用類型外還會(huì)被判斷成對(duì)象,所以當(dāng)對(duì)引用類型的判斷結(jié)果當(dāng)做選擇或判斷條件時(shí)需要特別注意。
Object.prototype.toString()
Object.prototype.toString()
方法返回一個(gè)表示對(duì)象的字符串,該方法可以準(zhǔn)確地判斷數(shù)據(jù)類型,并且可以處理原始類型。
下面是官方對(duì)該方法的一些描述:
- 如果this 值未定義,則返回
"[object Undefined]"
- 如果this 值為null,則返回
"[object Null]"
- 設(shè) O 是 ToObject(this),如果傳的原始類型,那就會(huì)調(diào)用
ToObject()
將原始類型轉(zhuǎn)換成對(duì)象 - 設(shè) class 是 O 的
[[Class]]
的內(nèi)部屬性 - 返回 String 值,該值是連接三個(gè) String
"[object"、 class和 "]"
而成的字符串結(jié)果
[[Class]]
屬性是JavaScript中每個(gè)對(duì)象都具有的內(nèi)部屬性,用于指定對(duì)象的類型。但我們沒(méi)法直接使用,它通??梢酝ㄟ^(guò)Object.prototype.toString.call(obj)
方法獲取。
例如:
Object.prototype.toString.call(123); // "[object Number]" Object.prototype.toString.call("hello"); // "[object String]" Object.prototype.toString.call(true); // "[object Boolean]" Object.prototype.toString.call([]); // "[object Array]" Object.prototype.toString.call({}); // "[object Object]"
Array.isArray()
Array.isArray()
方法用于判斷一個(gè)對(duì)象是否為數(shù)組,它也只能用來(lái)判斷數(shù)組,它是 ES5 引入的方法。例如:
Array.isArray([]); // true Array.isArray({}); // false
區(qū)別與總結(jié)
typeof
可以準(zhǔn)確判斷除了null
之外的原始類型,但對(duì)于引用類型的判斷不夠精確,例如typeof []
返回"object"
,無(wú)法區(qū)分?jǐn)?shù)組和其他對(duì)象。instanceof
只能判斷引用類型,通過(guò)原型鏈查找來(lái)判斷,但不能準(zhǔn)確地判斷原始類型。Object.prototype.toString()
能夠準(zhǔn)確地判斷數(shù)據(jù)類型,包括原始類型和引用類型,是最精確的類型判斷方法。Array.isArray()
專門(mén)用于判斷數(shù)組,是最簡(jiǎn)潔明了的數(shù)組類型判斷方法。
結(jié)合以上內(nèi)容,我們可以得出結(jié)論:在進(jìn)行類型判斷時(shí),應(yīng)根據(jù)具體情況選擇合適的方法,以確保判斷的準(zhǔn)確性和可靠性??偟膩?lái)說(shuō),了解并掌握這些類型判斷方法,能夠幫助我們更好地編寫(xiě) JavaScript 代碼,提高代碼的質(zhì)量和可維護(hù)性。
以上就是JavaScript中常見(jiàn)的類型判斷方法和區(qū)別詳解的詳細(xì)內(nèi)容,更多關(guān)于JavaScript類型判斷方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript ECMA-262-3 深入解析.第三章.this
在這篇文章里,我們將討論跟執(zhí)行上下文直接相關(guān)的更多細(xì)節(jié)。討論的主題就是this關(guān)鍵字2011-09-09利用prop-types第三方庫(kù)對(duì)組件的props中的變量進(jìn)行類型檢測(cè)
本篇文章主要介紹了利用prop-types第三方庫(kù)對(duì)組件的props中的變量進(jìn)行類型檢測(cè)的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-05-05微信小程序在ios下Echarts圖表不能滑動(dòng)的問(wèn)題解決
這篇文章主要介紹了微信小程序在ios下Echarts圖表不能滑動(dòng)的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來(lái)一起學(xué)習(xí)下吧2019-07-07解決Webpack 熱部署檢測(cè)不到文件變化的問(wèn)題
下面小編就為大家分享一篇解決Webpack 熱部署檢測(cè)不到文件變化的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02網(wǎng)頁(yè)運(yùn)行時(shí)提示對(duì)象不支持abigimage屬性或方法
網(wǎng)頁(yè)中用了一個(gè)js插件,js文件引用的沒(méi)有錯(cuò)但是運(yùn)行時(shí)ie的調(diào)試工具報(bào)了一個(gè)錯(cuò),提示對(duì)象不支持abigimage屬性或方法2014-08-08一個(gè)用javascript寫(xiě)的select支持上下鍵、首字母篩選以及回車(chē)取值的功能
一個(gè)用javascript寫(xiě)的select支持上下鍵、首字母篩選以及回車(chē)取值的功能2009-09-09JavaScript原生開(kāi)發(fā)視頻播放器的實(shí)現(xiàn)代碼
這篇文章我們將一起探索一份自定義的視頻播放器實(shí)現(xiàn)代碼,甚至還可以實(shí)現(xiàn)有彈幕功能,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-06-06用javascript實(shí)現(xiàn)記錄來(lái)賓姓名的代碼
用javascript實(shí)現(xiàn)記錄來(lái)賓姓名的代碼...2007-03-03js實(shí)現(xiàn)移動(dòng)端編輯添加地址【模仿京東】
本篇文章主要介紹了js實(shí)現(xiàn)移動(dòng)端編輯添加地址[模仿京東]的實(shí)例。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04JavaScript之Date_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在JavaScript中,Date對(duì)象用來(lái)表示日期和時(shí)間。下面給大家介紹js中的date,需要的朋友參考下吧2017-06-06