js 資料型別判斷的方法
阿新 • • 發佈:2020-12-04
typeof
一般用於判斷基本資料型別,用於判斷引用資料型別和null時會發生意外的錯誤
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 這裡會判斷異常,建議使用Array.isArray區分陣列和物件 //以下也會判斷異常 typeof new Boolean(true) === 'object'; typeof new Number(1) === 'object'; typeof new String('abc') === 'object'; //最後來看null typeof null // object
來看下typeof的原理:不同的物件在底層都表示為二進位制,在js裡二進位制前三位都為0的會 被判斷為object型別,null的二進位制表示全0(對應機器碼的null指標,一般為全0),所以會被判斷成object型別。
instanceof
它的主要作用是用來判斷一個例項是否屬於某種型別,用於判斷物件很合適
語法:object instanceof constructor object 某個例項物件 constructor 某個建構函式 'abc' instanceof String //false 檢查原型鏈會返回undefined new String('abc') instanceof String //true new Boolean(true) instanceof Boolean // true new Number(1) instanceof Number // true 順便做一下簡單實現 function new_instance_of(leftVaule,rightVaule) { let leftProto = leftVaule.__proto__; // 取左表示式的__proto__值 let rightPrototype = rightVaule.prototype; // 取右表示式的 prototype 值 while (true) { if (leftProto === null) { return false; } if (rightPrototype === rightProto) { return true; } leftProto = leftProto.__proto__ } }
constructor
根據資料型別的建構函式返回型別,但是由於null和undefined沒有建構函式故無法判斷
''.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()
可以通過 toString() 來獲取每個物件的型別。為了每個物件都能通過Object.prototype.toString() 來檢測,需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式來呼叫,傳遞要檢查的物件作為第一個引數。
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來判斷屬性的型別Symbol.toStringTag只適合做特定的型別判斷
//lodash.baseGetTag部分重要原始碼 //如果值是undefined和null返回對應tag if (value == null) { return value === undefined ? '[object Undefined]' : '[object Null]' } // 如果不支援Symbol或者value值上面沒有Symbol.toStringTag屬性, //直接返回Object.prototype.toString呼叫後的值 if (!(symToStringTag && symToStringTag in Object(value))) { return toString.call(value) }
以上就是js 資料型別判斷的方法的詳細內容,更多關於js 資料型別判斷的資料請關注我們其它相關文章!