首頁  >  文章  >  web前端  >  javascript中透過哪些方法來檢測數組類型?

javascript中透過哪些方法來檢測數組類型?

伊谢尔伦
伊谢尔伦原創
2017-07-18 13:19:491008瀏覽

typeof操作符。

對於Function、String、Number、Undefined這幾種類型的物件來說,不會有什麼問題,但是針對Array的物件就沒什麼用途了: 

alert(typeof null); // "object" 
alert(typeof []); // "object"

#instanceof

  當只有一個全域執行環境時適用,如果包含多個框架,就存在兩個以上不同版本的Array建構函數,如果從一個框架到另一個框架傳遞數組,傳入的數組與在第二個框架中原生創建的數組分別具有不同的建構函數,即為不同類型


if (value instanceof Array) {
  //对数组执行某项操作   
}

Array. isArray() 方法

  因為是ES5新增的,只支援IE9+、Firefox 4+、Safari 5+、Opera 10.5+和Chrome


if (Array.isArray(value)) {
  //对数组执行某些操作 
}

Object.prototype.toString.call()方法

#  適用於所有環境,只支援原生的對象,Object的toString()方法不能偵測非原生建構函式的建構函式名。開發人員自訂的任何建構子都會傳回[object Object]

  原理:在任何值上直接呼叫Object的原生toString()方法,都會傳回[object NativeConstrctorName]格式的字串,每個類別內部都有一個class屬性,這個屬性中就指定了上述字串中建構函數名。


var value = []
console.log(Object.prototype.toString.call(value))//"[Object Array]"

  由於原生陣列的建構子名稱和作用域無關,因此使用toString()方法就能保證輸出相同的值。 

  為什麼不使用物件自己的toString() 方法?


var value = []
console.log(value.toString())//" "
value = ['pp','oo']
console.log(value.toString())//"pp,oo"
value = ['pp',"oo"]
console.log(Object.prototype.toString.call(value))//[object Array]

  Array的tostring()方法被重寫了(許多原生物件都是如此),所以它會呼叫自己建構子上的toString()方法,傳回其他的字串

  也可以用此方法來判斷是不是原生函數或正規表示式


function isFunction(value){
    return Object.prototype.toString.call(value) === “[object Function]”
}//不适用于IE中以COM对象实现的任何函数
function isRegExp(value){
    return Object.prototype.toString.call(value) === “[object RegExp]”
}

物件的constructor屬性

除了instanceof,我們還可以利用每個物件都具有constructor的屬性來判斷其類型,於是乎我們可以這樣做: 

var arr = []; 
alert(arr.constructor == Array); // true

貌似後兩個解決方案是無懈可擊的,但真的是這樣麼?天有不測風雲,當你在多個frame中來回穿梭的時候,令人沮喪的問題出現了: 

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

由於每個iframe都有一套自己的執行環境,跨frame實例化的對象彼此是不共享原型鏈的,因此導致上述檢測程式碼失效!怎麼辦怎麼辦? ?嗯,javascript是動態語言,或許萬金油“鴨式辨型”(duck type)可以助我們一臂之力“如果它走起路來像鴨子,叫起來也像鴨子,那就當他是鴨子吧”,同理,可以偵測某些陣列物件特有的能力來做判斷,這個法子已經有人用了,例如Prototype框架,來看看它實現的Object.isArray方法: 

isArray: function(object) { 
return object != null && typeof object == "object" && 
'splice' in object && 'join' in object; 
}

以上是javascript中透過哪些方法來檢測數組類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn