標籤:系統 instance 瀏覽器 lib cto bool boolean 個數 ==
typeof和instanceof的區別
typeof和instanceof都可以用來判斷變數,它們的用法有很大區別:
typeof會返回一個變數的基本類型,只有以下幾種:number,boolean,string,object,undefined,function;例:
alert(typeof(1));//number
alert(typeof("abc"));//string
alert(typeof(true));//boolean
alert(typeof(m));//undefined
如果我們想要判斷一個變數是否存在,可以使用typeof:(不能使用if(a) 若a未聲明,則報錯)
if(typeof a != ‘undefined‘){
//變數存在
}
instanceof返回的是一個布爾值,如:
var a = {};
alert(a instanceof Object); //true
var b = [];
alert(b instanceof Array); //true
需要注意的是,instanceof只能用來判斷對象和函數,不能用來判斷字串和數字等,如:
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可以判斷變數是否為數組
大家都知道js中可以使用typeof來判斷變數的基本類型,如:
alert(typeof ‘111‘); // "string"
alert(typeof 22); // "number"
alert(typeof a); // "undefined"
alert(typeof undefined); // "undefined"
alert(typeof []); // "object"
但是這個方法不適用於來判斷數組,因為不管是數組還是對象,都會返回object,這就需要我們需求其他的方法。
有幾種方法可以拿來判斷:
1、constructor屬性
這個屬性在我們使用js系統或者自己建立的對象的時候,會預設的加上,例如:
var arr = [1,2,3]; //建立一個數組對象
arr.prototype.constructor = Array; //這一句是系統預設加上的
所以我們就可以這樣來判斷:
var arr = [1,2,3,1];
alert(arr.constructor === Array); // true
2、instanceof
instanceof是檢測對象的原型鏈是否指向建構函式的prototype對象的,所以我們也可以用它來判斷:
var arr = [1,2,3];
alert(arr instanceof Array); // true
最後,為了給大家一個結果,現寫出一個終極解決方案:
判斷數組終極解決方案
var arr = [1,2,3];
function isArrayFn(obj){ //封裝一個函數
if (typeof Array.isArray === "function") {
return Array.isArray(obj); //瀏覽器支援則使用isArray()方法
}else{ //否則使用toString方法
return Object.prototype.toString.call(obj) === "[object Array]";
}
}
alert(isArrayFn(arr));// true
js中typeof和instanceof用法區別