JS中的類型檢測總結

JS中的類型檢測

typeof操做符

typeof對於每一種基本類型都有不一樣的返回值,可是對於全部的引用類型都只返回'object'瀏覽器

注意:對於Null類型返回'object',對於特殊的引用類型Function返回'function'安全

Undefined類型: 'undefined'

Boolean類型: 'boolean'

String類型: 'string'

Number類型: 'number'

引用類型/Null類型: 'object'

Function類型: 'function'

instanceof操做符

instanceof 操做符用來判斷左表達式的原型鏈裏有沒有右表達式的原型。函數

所以在必定狀況下能夠用來做爲引用類型的檢測方法。spa

好比,對於某個regexp實例a,利用instanceof來檢測:a._proto_爲RegExp.prototype;RegExp.prototype爲RegExp.prototype,兩個值相等,返回trueprototype

Javascript instanceof 運算符源碼code

function instance_of(L, R) {//L 表示左表達式,R 表示右表達式
 var O = R.prototype;// 取 R 的顯示原型
 L = L.__proto__;// 取 L 的隱式原型
 while (true) { 
   if (L === null) 
     return false; 
   if (O === L)// 這裏重點:當 O 嚴格等於 L 時,返回 true 
     return true; 
   L = L.__proto__; 
 } 
}

在利用instanceof來進行類型檢測時,左表達式爲檢測對象,右表達式爲須要檢測的引用類型的構造函數regexp

Object
Array
Function
Date
RegExp
Function
Global
Math
//如下爲基本類型的顯示構造函數,這些構造函數的實例不是基本類型。
Boolean
Number
String

注:Global對象是兜底的對象,全部全局變量和全局函數都是Global對象的屬性,Global對象的屬性有各類原生的構造函數,還有三個特殊值NaN,undefined,Infinity。 window對象是Global對象的瀏覽器實現,可是window對象包含更多的原生屬性。對象

instanceof類型檢測的缺點ip

instanceof的左右表達式必須知足在同個全局做用域中,由於不一樣全局做用域的構造函數的prototype屬性不是同一個對象,好比在frame1中的Array.prototype與frame2中的Array.prototype就不是一個對象。原型鏈

安全的類型檢測方法

Object.protptype.toString.call(value)

在任何值上調用Object.prototype.toString,都會返回一個[object NativeConstructorName]的字符串。

好比:

var a = []

console.log(Object.prototype.toString.call(a)); //'[object Array]'

對於上文提到的全部類型以及JSON類型,這個方法都會返回不一樣的字符串(NativeConstructorName以大寫字母開頭),因此這是一個類型檢測的好方法。

相關文章
相關標籤/搜索