JS中最古老的跨域問題之壹就是在幀(frame)之間來回傳遞數組。開發者很快發現instanceof Array在此場景中不總是返回正確的結果。正如上文提到的,每個幀(frame)都有各自的Array構造函數,因此壹個幀(frame)中的實例在另外壹個幀裏不會被識別。Douglas Crockford首先推薦使用“鴨式辨型”接口(duck typing)“鴨式辨型”是由作家James Whitcomb Riley首先提出的概念,即“像鴨子壹樣走路、遊泳並且嘎嘎叫的鳥就是鴨子”,本質上是關註“對象能做什麽”,而不要關註“對象是什麽”。
// 采用鴨式辨型的方法檢測數組function isArray(value) { return typeof value.sort === "function";
}這種檢測方法依賴壹個事實,即數組是唯壹包含sort()方法的對象。當然,如果傳入isArray()的參數是壹個包含sort()方法的對象,它也會返回true。
關於如何在JS中檢測數組類型已經有很多研究了,最終,Juriy Zaytsev(也被稱作Kangax)給出了壹種優雅的解決方案。
function isArray(value) { return Object.prototype.toString.call(value) === "[object Array]";
}Kangax發現調用某個值的內置toString()方法在所有瀏覽器中都會返回標準的字符串結果。對於數組來說,返回的字符串為"[object Array]",也不用考慮數組實例是在哪個幀(frame)中被構造出來的。Kangax給出的解決方案很快流行起來,並被大多數JS類庫所采納。
這種方法在識別內置對象時往往十分有用,但對於自定義對象請不要用這種方法。比如,內置JSON對象使用這種方法將返回"[object JSON]"。
從那時起, ECMAScript5將Array.isArray()正式引入JS。唯壹的目的就是準確地檢測壹個值是否為數組。同Kangax的函數壹樣, Array.isArray()也可以檢測跨幀(frame)傳遞的值,因此很多JS類庫目前都類似地實現了這個方法。
相信看了本文案例妳已經掌握了方法,更多精彩請關註Gxl網其它相關文章!
推薦閱讀:
web開發中事件處理規則有哪些
為什麽web開發中需要避免使用全局變量