instanceof 和 typeof 原理回顧

2021-10-09 02:25:17 字數 3944 閱讀 7088

object instanceof constructor  // object為要測試的例項物件    constructor為建構函式
注意:instanceof無法判斷基本型別,只能判斷引用型別

let obj =

newobject()

console.

log(obj instanceof

object

)// true

class

person

const p =

newperson()

console.

log(p instanceof

person

)// true

// 判斷 f 是否是 f 類的例項

functionf(

)const f =

newf()

console.

log(f.__proto__ ===

f.prototype)

// true 因為f的prototype === f的__proro__ 符合 instanceof 檢測條件,所以下面為true

console.

log(f instanceoff)

// true

下面的**說明了date也屬於object型別,date是由object類派生出來的

const d =

newdate()

console.

log(d instanceof

date

)// true

console.

log(date instanceof

object

)// true

console.

log(d instanceof

object

)// true

題型1
console.

log(function instanceof

function

) console.

log(function instanceof

object

)console.

log(object instanceof

function

)console.

log(object instanceof

object

)

思路如下:

console.

log(function.__proto__ === function.prototype)

console.

log(function.__proto__.__proto__ === object.prototype)

console.

log(object.__proto__ === function.prototype)

console.

log(object.__proto__.__proto__ === object.prototype)

題型2
function

fun(

)const f =

newfun()

console.

log(f instanceof

fun)

// true

function

fun2()

}const f2 =

newfun2()

console.

log(f2 instanceof

fun2

)// false

因為instanceof操作符是判斷原型鏈上的物件,而當乙個物件並不是通過原型構造出來的時候(直接return乙個物件),此方法就失效了.

function

instanceof

(obj, constructor)if(

typeof obj !==

'object'

&&typeof obj !==

'function'

)let proto = obj.__proto__

while

(proto)

proto = proto.__proto__

}return

false

}

typeof 操作符返回乙個字串,表示未經計算的運算元的型別

typeof operand

typeof(operand) // operand 是乙個表示物件或原始值的表示式,其型別將被返回

在很早之前,使用的32位系統,為了效能考慮使用低位儲存了變數的型別資訊.

此外還有2個比較特殊的指:undefinednull

這樣一來,null就出了乙個bug.因為它對應的空指標,低位是000,因此被判斷成乙個物件了.且這個bug,應該是永遠都不會去修復了.

console.

log(

typeof undefined)

// undefined

console.

log(

typeof

null

)// object

console.

log(

typeof

123n)

// bigint

console.

log(

typeof

symbol

('str'))

// symbol

console.

log(

typeof((

)=>))

// function

console.

log(

typeof

)// object

在es2015之前,typeof總能保證對任何所給的運算元返回乙個字串,即使是未宣告的識別符號,也能返回undefined. 但是在有了letconst塊級作用域後,在其被宣告之前對塊中的letconst變數使用typeof將會丟擲乙個referenceerror.

console.

log(

typeof obj2)

// uncaught referenceerror: cannot access 'obj2' before initialization

const obj2 =

當前所有的瀏覽器都暴露了乙個型別為undefined的非標準宿主物件document.all

console.

log(

typeof document.all)

// undefined

我們通過tostring來獲取型別,算是乙個比較完美的方案.

function

gettype

(obj)

// 或者下面的寫法

function

gettype

(obj)

}

通常,我們使用typeof來判斷基本型別 ,instanceof判斷引用型別.

js typeof和instanceof的區別

typeof是乙個一元運算,放在乙個運算數前面,運算數可以是任意型別的數 返回值一般有這幾個 number,boolean,string,function,object,undefined 實際應用中通常用來獲取乙個變數是否存在,if typeof a undefined 不要用if a 這樣的方式...

instanceof 和型別轉換

instanceof是j a的乙個保留關鍵字,先有繼承關係,再有instanceof的使用左邊是物件,右邊是類,返回型別是boolean型別。它的具體作用是測試左邊的物件是否是右邊類或者該類的子類建立的例項物件,是,則返回true,否則返回false。system.out.println a 物件 ...

js之 typeof和instanceof的區別

typeof和instanceof的區別 typeof可以獲取任意變數的型別 任意型別的物件用typeof獲得到的都是object 但是instanceof只能判斷物件的型別。示例一 這樣就可以在控制台上獲得 object 所以驗證了我們上邊所說的 任意型別的物件用typeof獲得到的都是objec...