Javascript isArray 數(shù)組類型檢測函數(shù)
2024-05-06 14:13:35
供稿:網(wǎng)友
 
1、typeof操作符。對于Function、String、Number、Undefined這幾種類型的對象來說,不會有什么問題,但是針對Array的對象就沒什么用途了: 
Js代碼 
 代碼如下: 
alert(typeof null); // "object" 
alert(typeof []); // "object" 
 
2、instanceof操作符。此操作符檢測對象的原型鏈?zhǔn)欠裰赶驑?gòu)造函數(shù)的prototype對象,恩,聽起來不錯(cuò),應(yīng)該可以解決我們的數(shù)組檢測問題: 
Js代碼 
 代碼如下: 
var arr = []; 
alert(arr instanceof Array); // true 
 
3、對象的constructor屬性。除了instanceof,我們還可以利用每個(gè)對象都具有constructor的屬性來判斷其類型,于是乎我們可以這樣做: 
Js代碼 
 代碼如下: 
var arr = []; 
alert(arr.constructor == Array); // true 
 
貌似后兩個(gè)解決方案是無懈可擊的,但真的是這樣么?天有不測風(fēng)云,當(dāng)你在多個(gè)frame中來回穿梭的時(shí)候,令人沮喪的問題出現(xiàn)了: 
Js代碼 
 代碼如下: 
var iframe = document.createElement('iframe'); 
document.body.appendChild(iframe); 
xArray = window.frames[window.frames.length-1].Array; 
var arr = new xArray(1,2,3); // [1,2,3] 
// 哎呀! 
arr instanceof Array; // false 
// 哎呀呀! 
arr.constructor === Array; // false 
 
由于每個(gè)iframe都有一套自己的執(zhí)行環(huán)境,跨frame實(shí)例化的對象彼此是不共享原型鏈的,因此導(dǎo)致上述檢測代碼失效!怎么辦怎么辦??嗯,javascript是動態(tài)語言,或許萬金油“鴨式辨型”(duck type)可以助我們一臂之力“如果它走起路來像鴨子,叫起來也像鴨子,那就當(dāng)他是鴨子吧”,同理,可以檢測某些數(shù)組對象特有的能力來做判斷,這個(gè)法子已經(jīng)有人用了,比如Prototype框架,來看看它實(shí)現(xiàn)的Object.isArray方法: 
Js代碼 
 代碼如下: 
isArray: function(object) { 
return object != null && typeof object == "object" && 
'splice' in object && 'join' in object; 
} 
 
isArray:”object,你有splice、join這兩個(gè)數(shù)組特有的方法嗎?” 
object:“嗯,沒錯(cuò)我有!” 
isArray:“好吧,那你就是個(gè)數(shù)組了,哪怕你是冒充的,囧……” 
Js代碼 
 代碼如下: 
var trickster = { splice: 1, join: 2 }; 
Object.isArray(trickster); // 假冒成功,耶 
 
沒錯(cuò),這個(gè)解決方案給人的感覺有點(diǎn)別扭,任何一個(gè)具有'splice'和'join'屬性的對象都能通過這個(gè)檢測!怎么辦怎么辦怎么辦??別著急,仔細(xì)想想,其實(shí)我們需要的是一個(gè)能取得對象實(shí)際類型,而且又能跨frame使用的方法即可。這不,細(xì)心的老外在翻閱ECMA262標(biāo)準(zhǔn)的時(shí)候發(fā)現(xiàn)了這個(gè)(btw,我也看了,怎么就沒發(fā)現(xiàn)這個(gè)用途呢,囧): 
ECMA-262 寫道 
 代碼如下: 
Object.prototype.toString( ) When the toString method is called, the following steps are taken: 
1. Get the [[Class]] property of this object. 
2. Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.