js 數(shù)據(jù)類型判斷的方法
typeof
一般用于判斷基本數(shù)據(jù)類型,用于判斷引用數(shù)據(jù)類型和null時(shí)會(huì)發(fā)生意外的錯(cuò)誤
typeof 1 // number
typeof '1' // string
typeof true // boolean
typeof Symbol('1') // symbol
typeof undefined // undefined
typeof function(){} // function
typeof { a: 1 } // object
typeof [1, 2, 3] // object 這里會(huì)判斷異常,建議使用Array.isArray區(qū)分?jǐn)?shù)組和對(duì)象
//以下也會(huì)判斷異常
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String('abc') === 'object';
//最后來(lái)看null
typeof null // object
來(lái)看下typeof的原理:不同的對(duì)象在底層都表示為二進(jìn)制,在js里二進(jìn)制前三位都為0的會(huì) 被判斷為object類型,null的二進(jìn)制表示全0(對(duì)應(yīng)機(jī)器碼的null指針,一般為全0),所以會(huì)被判斷成object類型。
instanceof
它的主要作用是用來(lái)判斷一個(gè)實(shí)例是否屬于某種類型,用于判斷對(duì)象很合適
語(yǔ)法:object instanceof constructor
object 某個(gè)實(shí)例對(duì)象 constructor 某個(gè)構(gòu)造函數(shù)
'abc' instanceof String //false 檢查原型鏈會(huì)返回undefined
new String('abc') instanceof String //true
new Boolean(true) instanceof Boolean // true
new Number(1) instanceof Number // true
順便做一下簡(jiǎn)單實(shí)現(xiàn)
function new_instance_of(leftVaule, rightVaule) {
let leftProto = leftVaule.__proto__; // 取左表達(dá)式的__proto__值
let rightPrototype = rightVaule.prototype; // 取右表達(dá)式的 prototype 值
while (true) {
if (leftProto === null) {
return false;
}
if (rightPrototype === rightProto) {
return true;
}
leftProto = leftProto.__proto__
}
}
constructor
根據(jù)數(shù)據(jù)類型的構(gòu)造函數(shù)返回類型,但是由于null和undefined沒(méi)有構(gòu)造函數(shù)故無(wú)法判斷
''.constructor == String //true new Number(1).constructor == Number //true new Function().constructor == Function //true true.constructor == Boolean //true new Date().constructor == Date //true
Object.prototype.toString.call()
可以通過(guò) toString() 來(lái)獲取每個(gè)對(duì)象的類型。為了每個(gè)對(duì)象都能通過(guò)Object.prototype.toString() 來(lái)檢測(cè),需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式來(lái)調(diào)用,傳遞要檢查的對(duì)象作為第一個(gè)參數(shù)。
var toString = Object.prototype.toString; toString.call(new Date); // [object Date] toString.call(new String); // [object String] toString.call(Math); // [object Math] toString.call(undefined); // [object Undefined] toString.call(null); // [object Null]
lodash.getTag和lodash.baseGetTag
baseGetTag使用Object.prototype.toString.call和Symbol.toStringTag來(lái)判斷屬性的類型Symbol.toStringTag只適合做特定的類型判斷

//lodash.baseGetTag部分重要源碼
//如果值是undefined和null返回對(duì)應(yīng)tag
if (value == null) {
return value === undefined ?
'[object Undefined]'
:
'[object Null]'
}
// 如果不支持Symbol或者value值上面沒(méi)有Symbol.toStringTag屬性,
//直接返回Object.prototype.toString調(diào)用后的值
if (!(symToStringTag && symToStringTag in Object(value))) {
return toString.call(value)
}
以上就是js 數(shù)據(jù)類型判斷的方法的詳細(xì)內(nèi)容,更多關(guān)于js 數(shù)據(jù)類型判斷的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JS實(shí)現(xiàn)省市縣三級(jí)下拉聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)省市縣三級(jí)下拉聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
迅速了解一下ES10中Object.fromEntries的用法使用
這篇文章主要介紹了迅速了解一下ES10中Object.fromEntries的用法使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
JavsScript中Promise的錯(cuò)誤捕獲詳解
怎么捕獲錯(cuò)誤并且處理是一門語(yǔ)言必備的知識(shí),在JavaScript中也是如此,下面這篇文章主要給大家介紹了關(guān)于JavsScript中Promise錯(cuò)誤捕獲的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
模仿JQuery sortable效果 代碼有錯(cuò)但值得看看
模仿JQuery sortable效果 代碼有錯(cuò)但值得看看,因?yàn)闀r(shí)間關(guān)系,需要的朋友可以參考下。2009-11-11
Locate a File Using a File Open Dialog Box
Locate a File Using a File Open Dialog Box...2007-06-06
JS中dom0級(jí)事件和dom2級(jí)事件的區(qū)別介紹
這篇文章主要介紹了JS中dom0級(jí)事件和dom2級(jí)事件的區(qū)別介紹,非常有參考價(jià)值,特此分享到腳本之家平臺(tái)供大家參考2016-05-05

