今天的學習任務(wù)是如何檢測一個數(shù)據(jù)是不是數(shù)組霞溪?
JavaScript中有基礎(chǔ)數(shù)據(jù)類型和**類型孵滞。有Boolean,Number鸯匹,String坊饶,Undefined,F(xiàn)unction殴蓬,和Object匿级,6種數(shù)據(jù)類型。
我們可以通過typeof檢測數(shù)據(jù)類型:
console.log(typeof function(){return;}) //function
console.log(typeof 'a'); //string
console.log(typeof 123); //number
console.log(typeof a); //undefined
console.log(typeof true); //boolean
console.log(typeof NaN); //number
console.log(typeof !NaN); //boolean
console.log(typeof {name:'lee'}); //object
console.log(typeof ["lee"]); //object
console.log(typeof null); //object
我們可以通過typeof檢測大部分數(shù)據(jù)類型染厅,但{name:'lee'}和['lee']都為object痘绎,此時如何區(qū)分數(shù)組還是對象?
ECMAScript 5 的 isArray函數(shù)
function isArray(obj){
return Array.isArray(obj);
}
var arr=["lee","leewr"];
isArray(arr);//true
ECMAScript 5 還有著非常大的兼容性肖粮,所以我們并不能完美的使用原生判斷孤页,當使用ie8的時候就會出現(xiàn)問題。
所以對構(gòu)造函數(shù)進行檢測來判斷數(shù)據(jù)類型涩馆。
constructor
constructor屬性返回對創(chuàng)建此對象的函數(shù)的引用,使用此屬性可以檢測數(shù)組類型行施。
var test=new array();
if(test.constructor===Array){
console.log('array');
}
instanceOf
除了使用constructor自身屬性之外,還可以使用instanceof魂那。
instanceof用來判斷某個構(gòu)造函數(shù)的<code>prototype</code>是否存在于被檢測對象的原型鏈里蛾号。也就是判斷前面的對象是否是后者對象的類或者實例。
var str=["lee","leewr"];
console.log(str instanceof Array)
javascript語言精粹中:
var is_Array=function(value){
return value&&
typeof value==='object'
&& value.constructor===Array
}
需要注意的是涯雅,當在不同的window或iframe里構(gòu)造的數(shù)組時會失敗鲜结。這是因為每一個iframe都有它自己的執(zhí)行環(huán)境,彼此之間并不共享原型鏈,所以此時的判斷一個對象是否為數(shù)組就會失敗精刷。此時我們有一個更好的方式去判斷一個對象是否為數(shù)組拗胜。
Object.prototype.toString
var is_Array=function(value){
return Object.prototype.toString.call(value) === '[object Array]';
}
使用Object.prototype.toString方法來檢測對象類型。toString將返回[object type] type為對象類型贬养。下面是對象檢測顯示的結(jié)果挤土。
function dd(){}
var toString = Object.prototype.toString;
console.log(toString.call(dd));//[object Function]
console.log(toString.call(new Object));//[object Object]
console.log(toString.call(new Array));//[object Array]
console.log(toString.call(new Date));//[object Date]
console.log(toString.call(new String));//[object String]
console.log(toString.call(Math));//[object Math]
console.log(toString.call(undefined));//[object Undefined]
console.log(toString.call(null));//[object Null]
因此我們可以利用對象的Object.prototype.toString方法檢測對象是否為數(shù)組琴庵。在frame下也通過误算。
最佳檢測
最佳檢測方法就是,不管原生isArray是否可用迷殿,都回歸到object.prototype.toString的檢測上儿礼。
var is_Array=(function(obj){
if(Array.isArray){
return Array.isArray(obj)
}else{
var objectToStringFn =Object.prototype.toString,
arrayToStringResult=othertoString.call([]);
return function(subject){
return objectToStringFn.call(subject)===arrayToStringResult;
}
}
})()
總結(jié)
1.typeof不能用于數(shù)組檢測。
2.instanceof 和 constructor 能夠用于數(shù)組檢測庆寺,但是在iframe中會出現(xiàn)問題蚊夫。
3.對象toString檢測數(shù)組。
4.最后采用ECMScript5 isArray判斷來檢測懦尝,不支持的采用toString方法來檢測知纷。
最后不得不說,javascript語言精粹這本書本不錯陵霉。小小的一段都有很多需要總結(jié)的琅轧。