typeof&instanceof操做符

  • 七種數據類型

基本數據類型(簡單數據類型或原始類型):Undefined、Null、Boolean、Number、String 複雜數據類型:Object ES6新增的數據類型:Symbol 對象是最複雜的數據類型,他能夠分爲三個子類型:object、array、function(不正規說法)javascript

typeof操做符

var s = "yicong";
	var b = true;
	var n = null;
	var u;
	var o = new Object();
	function f(){};
	typeof s; // string
	typeof b; // boolean
	typeof n; // object 特殊
	typeof u; // undefined
	typeof o; // object
	typeof f; // function 
	typeof Symbol(); // symbol
	typeof {}; // object
	typeof []; // object
	typeof window; // object
	typeof NaN; // number複製代碼

如上所知:java

當在檢測引用類型的時候,typeof它返回的結果都是Object,因此在檢測引用值類型的時候typeof的用處並不大,因此咱們使用了ECMAScript提供的instanceof操做符來檢測引用類型值。

  • 若是是引用類型值,那麼instanceof操做符就會返回truegit

  • 注意:全部引用類型的值都是Object的實例,若是使用instanceof操做符去檢測基本類型的值,則它會返回falsegithub

爲何全部引用類型的值都是Object的實例?

由於當你在控制檯寫下 [] 的時候,它已經給你隱式幫你new Array()了,Array()是一個構造函數,因此[]就是對象的實例。函數

  • 解答:由於基本類型不是對象ui

手撕instanceof操做符

function instance_of(ordinary,construct){
    let conProto = construct.prototype;
    ordinary = ordinary.__proto__;
    while(true){//一直循環下去,也就是在ordinary的原型鏈上尋找,直到ordinary的原型鏈上有construct.prototype爲止
        if(ordinary === null){
            return false;
        }	
        if (ordinary === conProto){
            return true;
        }
        ordinary = ordinary.__proto__;
    }
}複製代碼

也就是說:spa

  • ordinary對象是否是construct構造函數構造(new)出來的,prototype

  • ordinary對象的原型鏈上有沒有construct的原型code

更多文章請轉移:github.com/wangyicong
對象

相關文章
相關標籤/搜索