javascript如何檢測一個數(shù)據(jù)是不是數(shù)組

今天的學習任務(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é)的琅轧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市踊挠,隨后出現(xiàn)的幾起案子乍桂,更是在濱河造成了極大的恐慌,老刑警劉巖效床,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睹酌,死亡現(xiàn)場離奇詭異,居然都是意外死亡剩檀,警方通過查閱死者的電腦和手機憋沿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沪猴,“玉大人卤妒,你說我怎么就攤上這事∽直遥” “怎么了则披?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洗出。 經(jīng)常有香客問我士复,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任阱洪,我火速辦了婚禮便贵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冗荸。我一直安慰自己承璃,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布蚌本。 她就那樣靜靜地躺著盔粹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪程癌。 梳的紋絲不亂的頭發(fā)上舷嗡,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音嵌莉,去河邊找鬼进萄。 笑死,一個胖子當著我的面吹牛锐峭,可吹牛的內(nèi)容都是我干的中鼠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼沿癞,長吁一口氣:“原來是場噩夢啊……” “哼援雇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抛寝,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤熊杨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后盗舰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晶府,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年钻趋,在試婚紗的時候發(fā)現(xiàn)自己被綠了川陆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛮位,死狀恐怖较沪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情失仁,我是刑警寧澤尸曼,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站萄焦,受9級特大地震影響控轿,放射性物質(zhì)發(fā)生泄漏冤竹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一茬射、第九天 我趴在偏房一處隱蔽的房頂上張望鹦蠕。 院中可真熱鬧,春花似錦在抛、人聲如沸钟病。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肠阱。三九已至,卻和暖如春望浩,著一層夾襖步出監(jiān)牢的瞬間辖所,已是汗流浹背惰说。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工磨德, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吆视。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓典挑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親啦吧。 傳聞我的和親對象是個殘疾皇子您觉,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容