# 前言
js 中 typeof
和 instanceof
常用來判斷一個變量是否為空芬骄,或者是什么類型的,那么他們之間有什么區(qū)別呢?
某種程度上兩種方式都行,但其中細節(jié)我們一定要搞清楚猎醇。
# typeof
typeof
是一個一元運算,放在一個運算數(shù)之前努溃,運算數(shù)可以是任意類型硫嘶。
返回值是一個 字符串
,該字符說明運算數(shù)的類型梧税。typeof
一般只會返回六中數(shù)據(jù)類型:
console.log( typeof 123 ); // 'number'
console.log( typeof 'abc' ); // 'string'
console.log( typeof true); // 'boolean'
console.log( typeof function text(){ } ); // 'function'
console.log( typeof null); // 'object'
console.log( typeof undefined); // 'undefined'
通陈偌玻可以使用 typeof 來獲取一個變量是否存在
if( typeof a != 'underfined' ){
alert('ok')
}
而不要去使用 if (a)
因為如果 a 不存在(未聲明)則會出錯。
再看一個例子:
console.log( typeof ['1','2','3'] ); // 'object'
console.log( typeof {name:'張三'} ); // 'object'
可以看出:判斷一個變量的類型常常會用 typeof 運算符沒有問題第队,但在使用 typeof 運算符時采用引用類型
存儲值會出現(xiàn)一個問題哮塞,無論引用的是什么類型的對象,他都會返回 object
凳谦,這正是 typeof 的局限性忆畅。
這就需要用到 instanceof 來檢測某個對象是不是另一個對象的實例。
# instanceof
instanceof
運算符用來測試一個對象在其原型鏈中是否存在一個構(gòu)造函數(shù)的 prototype 屬性
通俗講 instanceof
左 操作數(shù)是一個類尸执,右 操作數(shù)是標(biāo)識對象的類家凯。如果左側(cè)的對象是右側(cè)類的實例,則返回 true如失。而 js 中對象的類是通過初始化它們的構(gòu)造函數(shù)來定義的绊诲。即 instanceof
的右操作數(shù)應(yīng)當(dāng)是一個函數(shù)。所有的對象都是 object 的實例褪贵。如果左操作數(shù)不是對象驯镊,則返回 false,如果右操作數(shù)不是函數(shù)竭鞍,則拋出typeError。
語法:object instanceof constructor
參數(shù):object(要檢測的對象)contructor(某個構(gòu)造函數(shù))
描述:instanceof 運算符用來檢測 constructor.prototype 是否存在于參數(shù) object 的原型臉鏈上
舉個栗子:
function Foo() {}
function Bar() {}
Bar.prototype = new Foo();
new Bar() instanceof Bar; // true
new Bar() instanceof Foo; // true
// 如果僅僅設(shè)置 Bar.prototype 為函數(shù) Foo 本身橄镜,而不是 Foo 構(gòu)造函數(shù)的一個實例
Bar.prototype = Foo;
new Bar() instanceof Foo; // false
new String('foo') instanceof String; // true
new String('foo') instanceof Object; // true
'foo' instanceof String; // false
'foo' instanceof Object; // false
# 總結(jié)
- typeof判斷所有變量的類型偎快,返回值有number,boolean洽胶,string晒夹,function,object姊氓,undefined丐怯。
- typeof對于豐富的對象實例,只能返回"Object"字符串翔横。
- instanceof用來判斷對象读跷,代碼形式為obj1 instanceof obj2(obj1是否是obj2的實例),obj2必須為對象禾唁, 否則會報錯效览!其返回值為布爾值无切。
- instanceof可以對不同的對象實例進行判斷,判斷方法是根據(jù)對象的原型鏈依次向下查詢丐枉,如果obj2的原型屬性存在obj1的原型鏈上哆键,(obj1 instanceof obj2)值為true。
一般會結(jié)合兩者封裝成一個工具類:
function getDataType(obj) {
if (obj === null) {
return 'null';
} else if (typeof obj === 'object') {
if (obj instanceof Array) {
return 'array';
} else {
return 'object';
}
} else {
return typeof obj;
}
}
今天的內(nèi)容就到這里了瘦锹,小伙伴們記得點個贊哦 ~~~