js安全類型檢測

背景: 都知道js內置的類型檢測,大多數狀況下是不太可靠的,例如:  typeof  、 instanceof 安全

 

typeof 返回一個未經計算的操做數的類型, 能夠發現全部對象都是返回object  (null是空指針即空對象)函數

 

 

instanceof :  用於測試構造函數的prototype屬性是否出如今對象的原型鏈中的任何位置 (簡單理解: 左側檢測的對象是否能夠沿着原型鏈找到與右側構造函數原型屬性相等位置)  後面會附上模擬方法。測試

缺點:spa

一、instanceof 與全局做用域有關係,[] instanceof window.frames[0].Array 會返回false,由於 Array.prototype !== window.frames[0].Array.prototypeprototype

 

二、Object派生出來的子類都是屬於Obejct    [] instanceof Array  [] instanceof Object  都是true指針

 

instanceof 模擬實現:code

 1  function instanceOf(left, right) {
 2       let leftValue = left.__proto__
 3       let rightValue = right.prototype
 4        console.log(leftValue,rightValue)
 5        while (true) {
 6          if (leftValue === null) {
 7           return false
 8          }
 9          if (leftValue === rightValue) {
10            return true
11         }
12         leftValue = leftValue.__proto__
13       }
14      }
15 
16      let a = {};
17 
18      console.log(instanceOf(a, Array))

 

安全類型檢測方法: 對象

背景: 任何值上調用 Object 原生的 toString()方法,都會返回一個[object NativeConstructorName]格式的字符串。blog

NativeConstructorName  ===> 原生構造函數名 (便是它爸的名字,並不是爺爺(Object)的名字)原型鏈

function isArray(value){ 
 return Object.prototype.toString.call(value) == "[object Array]"; 
}
function isFunction(value){ 
 return Object.prototype.toString.call(value) == "[object Function]"; 
} 
function isRegExp(value){ 
 return Object.prototype.toString.call(value) == "[object RegExp]"; 
}

爲啥直接用實例對象的toString方法不能夠呢? 這是由於在其餘構造函數下,將toString方法進行了重寫。 例如: [1,2].toString()  ===>  "1,2"

相關文章
相關標籤/搜索