typeof和instanceof的區(qū)別
typeof和instanceof都可以用來判斷變量人芽,它們的用法有很大區(qū)別:
typeof會(huì)返回一個(gè)變量的基本類型,只有以下幾種:number,boolean,string,object,undefined,function婚度;例:
alert(typeof(1));//number
alert(typeof("abc"));//string
alert(typeof(true));//boolean
alert(typeof(m));//undefined
如果我們想要判斷一個(gè)變量是否存在耐量,可以使用typeof:(不能使用if(a) 若a未聲明,則報(bào)錯(cuò))
if(typeof a != 'undefined'){
//變量存在
}
instanceof返回的是一個(gè)布爾值仗处,如:
var a = {};
alert(a instanceof Object); //true
var b = [];
alert(b instanceof Array); //true
需要注意的是优幸,instanceof只能用來判斷對(duì)象和函數(shù)吨拍,不能用來判斷字符串和數(shù)字等,如:
var b = '123';
alert(b instanceof String); //false
alert(typeof b); //string
var c = new String("123");
alert(c instanceof String); //true
alert(typeof c); //object
另外网杆,用instanceof可以判斷變量是否為數(shù)組
大家都知道js中可以使用typeof來判斷變量的基本類型羹饰,如:
alert(typeof '111'); // "string"
alert(typeof 22); // "number"
alert(typeof a); // "undefined"
alert(typeof undefined); // "undefined"
alert(typeof []); // "object"
但是這個(gè)方法不適用于來判斷數(shù)組,因?yàn)椴还苁菙?shù)組還是對(duì)象碳却,都會(huì)返回object队秩,這就需要我們需求其他的方法。
有幾種方法可以拿來判斷:
1昼浦、constructor屬性
這個(gè)屬性在我們使用js系統(tǒng)或者自己創(chuàng)建的對(duì)象的時(shí)候馍资,會(huì)默認(rèn)的加上,例如:
var arr = [1,2,3]; //創(chuàng)建一個(gè)數(shù)組對(duì)象
arr.prototype.constructor = Array; //這一句是系統(tǒng)默認(rèn)加上的
所以我們就可以這樣來判斷:
var arr = [1,2,3,1];
alert(arr.constructor === Array); // true
2关噪、instanceof
instanceof是檢測對(duì)象的原型鏈?zhǔn)欠裰赶驑?gòu)造函數(shù)的prototype對(duì)象的鸟蟹,所以我們也可以用它來判斷:
var arr = [1,2,3];
alert(arr instanceof Array); // true
最后,為了給大家一個(gè)結(jié)果使兔,現(xiàn)寫出一個(gè)終極解決方案:
判斷數(shù)組終極解決方案
var arr = [1,2,3];
function isArrayFn(obj){ //封裝一個(gè)函數(shù)
if (typeof Array.isArray === "function") {
return Array.isArray(obj); //瀏覽器支持則使用isArray()方法
}else{ //否則使用toString方法
return Object.prototype.toString.call(obj) === "[object Array]";
}
}
alert(isArrayFn(arr));// true
本篇博客摘抄地址