今天就跟大家聊聊有關如何區別js中的typeof與instanceof,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
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來判斷就好
同時,可以發現引用類型數據,用typeof來判斷的話,除了function會被識別出來之外,其余的都輸出object
如果我們想要判斷一個變量是否存在,可以使用typeof:(不能使用if(a), 若a未聲明,則報錯)
if(typeof a != 'undefined'){
//變量存在
}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
typeof與instanceof都是判斷數據類型的方法,區別如下:
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,調用該方法,統一返回格式“[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有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。