typeof
typeof是判斷變量類型,它的返回值值為字符串,分別有6個值:number,boolean,string,function,object,undefined。
一般我們使用typeof來判斷變量是否存在,并進行代碼操作:
if(typeof a == undefined) console.log('N');
有人有時會用if(a)來判斷變量是否存在,但是這是不嚴謹的,因為變量值為null與undefined的狀態是一樣的,這樣就無法排除null
缺點:
對于 Array,null ,函數實例等特殊對象使用 typeof 一律返回 object,對于object,無法做進一步判斷;
function parent(){
console.log('parent')
}
function child(){
console.log('child')
}
var f1=new parent;
var f2=new child;
console.log(typeof f1)//object
console.log(typeof f2)//object
console.log(f1==parent);//false
而此時instanceof的出現正好妳補了這一局限性。
instanceof
instance中文翻譯為實例,因此instanceof的含義就不言而喻,判斷該對象是誰的實例,同時我們也就知道instanceof是對象運算符。
這里的實例就牽扯到了對象的繼承,它的判斷就是根據原型鏈進行搜尋,在對象obj1的原型鏈上如果存在另一個對象obj2的原型屬性,那么表達式(obj1 instanceof obj2)返回值為true;否則返回false。
例如:
function foo() {
}
function foo1() {
}
foo.prototype = new foo1();
var f = new foo;
console.log(f instanceof foo1); // true
console.log(f instanceof foo); // true
console.log(f instanceof Object); // true
console.log(f instanceof Array); // false
因為foo函數和foo1函數都存在對象f的原型鏈上,即對象f的原型鏈:f.__proto==>foo.prototype(foo1)==>foo1.prototype==>Object,而對象Array不存在對象f的原型鏈上,所以輸出結果如上。
所以我們可以使用instanceof來解決typeof的局限性。因為Array,null 等特殊對象使用 typeof 一律返回 object,無法進一步判斷,此時使用instanceof可以進一步對object進行判斷,判斷是否是Array或某個函數的實例,這樣對于條件判斷的使用就更靈活了,現在我們附上一段代碼,就看的更明確了。
function parent(){
}
function child(){
}
var f1=new parent;
var f2=new child;
console.log(typeof f1)//object
console.log(typeof f2)//object
console.log(f1==parent);//false
console.log(f1 instanceof parent);//true
console.log(f1 instanceof child);//false
console.log(f2 instanceof child);//true
總結:
想必到這里大家也都明白兩者的含義和用法,總之,typeof和instanceof都是用來判斷變量類型的,兩者的區別在于:
- typeof判斷所有變量的類型,返回值有number,boolean,string,function,object,undefined。
- typeof對于豐富的對象實例,只能返回"Object"字符串。
- instanceof用來判斷對象,代碼形式為obj1 instanceof obj2(obj1是否是obj2的實例),obj2必須為對象,否則會報錯!其返回值為布爾值。
- instanceof可以對不同的對象實例進行判斷,判斷方法是根據對象的原型鏈依次向下查詢,如果obj2的原型屬性存在obj1的原型鏈上,(obj1 instanceof obj2)值為true。