徹底了解instanceof的底層實現原理

2021-10-02 14:58:43 字數 2771 閱讀 4769

一、作用

①用於判斷某個例項是否屬於某建構函式

②在繼承關係中用來判斷乙個例項是否屬於它的父型別或者祖先型別的例項

說白了,只要右邊變數的 prototype 在左邊變數的原型鏈上即可。因此,instanceof 在查詢的過程中會遍歷左邊變數的原型鏈,直到找到右邊變數的 prototype,如果查詢失敗,則會返回 false

二、語法

[物件] instanceof [建構函式]

如:

var obj =

newobject()

obj instanceof

object

// true

三、涉及的建構函式

基礎型別:string、number、boolean、undefined、null、symbol

複雜型別:array,object

其他型別:function、regexp、date

四、底層原理

function

instance_of(l

,r)}

**解釋:

①l表示物件例項,r表示建構函式或者父型別例項

②取r的顯式原型,取l的隱式原型

③迴圈遍歷,進行判斷②中的兩個值是否相等,相等返回true,不相等繼續查詢l的原型鏈

五、未發生繼承關係時

function

cat(name,age,type)

function

dog(name)

var cats =

newcat

('有魚',2

,'英短'

);var dogs =

newdog

('哈士奇');

console.

log(cats instanceof

cat)

;// true

console.

log(dogs instanceof

dog)

;// true

console.

log(cats instanceof

object);

// true

console.

log(dogs instanceof

object);

// true

先看一下「cats instanceof cat」運**況:

function

instance_of(l

,r)}

再看一下「cats instanceof object」運**況:

function

instance_of(l

,r)}

六、產生繼承關係時

function

cat(name,age,type)

function

yingduan

(name,age,type,***)

yingduan.prototype =

newcat()

;// 這裡改變了原型指向,實現繼承

var yd =

newyingduan

("有魚",2

,"金漸層"

,"男");

//建立了英短物件yd

console.

log(yd instanceof

yingduan);

// true

console.

log(yd instanceof

cat)

;// true

console.

log(yd instanceof

object);

// true

先看一下「yd instanceof yingduan」運**況:

function

instance_of(l

,r)}

再看一下「yd instanceof cat」運**況,即如何判斷yd繼承了cat:

function

instance_of(l

,r)//yd._proto_ ._proto_,指的就是cat.prototype,所以也返回true

}//這就證明了yd繼承了cat

yd instanceof object也是同理的,這裡暫不贅述。

七、注意問題

instanceof 用於判斷物件型別,但以下情況的結果都為false,請注意

console.

log(

number instanceof number

)// false

console.

log(

string instanceof string

)// false

console.

log(

fun instanceof fun

)// false,這裡fun指的是函式

console.

log(null instanceof object

)// false,null不具有任何物件的特性,也沒有__proto__屬性

徹底了解instanceof的底層實現原理

今天看了instanceof底層實現原理,這篇文章解析的很簡單易懂。一 作用 用於判斷某個例項是否屬於某建構函式 在繼承關係中用來判斷乙個例項是否屬於它的父型別或者祖先型別的例項 說白了,只要右邊變數的 prototype 在左邊變數的原型鏈上即可。因此,instanceof 在查詢的過程中會遍歷左...

徹底了解指標

一 關於指標和堆的記憶體分配 先來介紹一下指標 指標一種型別,理論上來說它包含其他變數的位址,因此有的書上也叫它 位址變數。既然指標是乙個型別,是型別就有大小,在達內的伺服器上或者普通的 機上,都是 個位元組大小,裡邊只是儲存了乙個變數的位址而已。不管什麼型別的指標,char int int str...

一文徹底了解join的各種用法

表a 表b a1 a2 b1 b2 a01 張三 a02 數學 a02 李四 a03 語文 a03 王五 a04 英語 1selecta.a2,b.b2fromaleftjoinbona.a1 b.b1 張三 李四 數學 王五 語文 1selecta.a2,b.b2fromainnerjoinbon...