亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JS教程:數組類型檢測和集合檢測

2024-09-06 12:40:56
字體:
來源:轉載
供稿:網友

question:編寫一個函數 isarray(testvar) 。當testvar是數組類型時,返回1;當testvar是集合時,返回2;其他情況返回0。

solution:

一、數組類型檢測

(1)檢測構造函數

本來這應該是最簡單的事情,javascript中提供了instanceof運算符,可以檢測某個變量是否某種類型的實例,一般情況下可以這樣檢測數組:testvar instanceof array == true。但是,在跨frame的時候,等式不成立。假設測試頁test.html的代碼如下:

<script language=”javascript” type=”text/javascript”>
//<![cdata[
function isarray(testvar) {
 return testvar instanceof array;
}
//]]>
</script>
<iframe id=”testframe” src=”testframe.html”></iframe>

testframe.html的代碼如下:

<script language=”javascript” type=”text/javascript”>
//<![cdata[
function isarray(testvar) {
 alert(parent.isarray([]));
}
//]]>
</script>

輸出的內容是false。似乎每個頁面都有自己的array類型,如果把isarray改寫一下,輸出的就是true:

function isarray(testvar) {
 return testvar instanceof document.getelementbyid(”testframe”).contentwindow.array;
}

檢測testvar.constructor也會出現類似的情況。因此,這種方法不可行。

(2)檢測特性

通過數組獨有的函數進行檢測,比如檢測testvar.sort是否未定義。這種方法在一般情況下也是可行的,但是健壯性不足。如果給testvar動態加了一個sort方法,判斷就會失誤。

(3)jquery1.3帶來了曙光

沒什么好說的,直接看代碼,太牛了:

if (object.prototype.tostring.call(testvar) === “[object array]“) return 1;

二、集合檢測

所謂的集合就是可以通過下標訪問但又不是數組的類型。已知的javascript集合有兩種,一種是htmlcollection,另一種是函數的參數arguments。

(1)排他法

在已知testvar不是數組的情況下,先檢測它的length屬性是否存在。包含length屬性的類型也不少,比如window、string、某些htmlelement。所以要檢測的特征非常多:

testvar.length != null &&
!testvar.alert && // 不是window
!testvar.charat && // 不是string
!testvar.nodetype // 不是htmlelement

由于其他情況實在太多,容易出現疏漏,所以最終還是沒有采取這種辦法。

(2)檢測特性

已知的集合只有兩種,所以還是檢查這兩種集合的特性吧。htmlcollection有item方法,而arguments則有callee屬性:

if (testvar.item || testvar.callee) return 2;

這時,select元素開始攪局。它竟然包含htmlcollectiond的所有特性。于是,還是要判斷nodetype:

if (!testvar.nodetype && testvar.item || testvar.callee) return 2;

select元素被轟走了,萬惡的ie開始搗亂。首先是xml的問題,某個ajax回調函數:

function onsuccess(xhr) {
var xmldoc = xhr.responsetext;
alert(xmldoc.getelementsbytagname); // ie下報錯
var root = xmldoc.getelementsbytagname(”root”);
alert(root.item) // ie下報錯
}

也就是說,在ie下,只要嘗試檢測xml節點或xml節點集合的方法都會報錯。幸好還可以用typeof去對付它們。

function onsuccess(xhr) {
var xmldoc = xhr.responsetext;
alert(typeof(xmldoc.getelementsbytagname)); // ie下輸出”unknown”
var root = xmldoc.getelementsbytagname(”root”);
alert(typeof(root.item)) // ie下輸出”unknown”
}

因此,代碼就改成:

if (!testvar.nodetype && typeof testvar.item != “undefined” || testvar.callee) return 2;

其次,是window對象的問題:ie下的window對象也有item方法。所以還是要檢測window對象:

if (!testvar.nodetype && typeof testvar.item != “undefined” && !testvar.alert || testvar.callee) return 2;

雖然檢測特性容易出現失誤,但是目前也只有這種辦法了。

至此,終于折騰完,整個函數簡寫后就是:

var isarray = function(testvar) {
 return object.prototype.tostring.call(testvar) === “[object array]” ? 1 :  testvar.callee || (typeof testvar.item != “undefined” && !testvar.nodetype && !testvar.alert) ? 2 : 0;
};

目前還不知道有沒有疏漏。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲电影中文字幕| 91精品视频免费| 亚洲国产欧美一区二区丝袜黑人| 欧美日韩亚洲视频一区| 色综合久久天天综线观看| 亚洲欧美一区二区三区在线| 亚洲成人激情图| 久久久久久久激情视频| 91在线|亚洲| 中文字幕国产日韩| 国产精品久久久久久久久久免费| 97婷婷涩涩精品一区| 色小说视频一区| 在线丨暗呦小u女国产精品| 精品国产一区久久久| 国产午夜精品久久久| 精品国产成人av| 日韩精品有码在线观看| 欧美大片免费观看在线观看网站推荐| 国产精品视频一区二区三区四| 国产在线拍偷自揄拍精品| 国产日韩在线免费| 中文字幕少妇一区二区三区| 国产主播精品在线| 中文字幕自拍vr一区二区三区| 丝袜美腿精品国产二区| 岛国av一区二区| 亚洲精品国产精品国自产在线| 成人精品视频99在线观看免费| 岛国av一区二区在线在线观看| 国产精品视频一| 亚洲美女av在线| 亚洲精品一区中文字幕乱码| 欧美午夜女人视频在线| 午夜精品国产精品大乳美女| 国产91在线播放九色快色| 亚洲精品按摩视频| 九九久久国产精品| 精品国产一区二区三区在线观看| 亚洲人成网站免费播放| 欧美精品午夜视频| 亚洲人成人99网站| 欧美性猛交xxxx富婆弯腰| 亚洲欧洲午夜一线一品| 久久久精品一区| 色哟哟网站入口亚洲精品| 69视频在线免费观看| 久久久噜噜噜久噜久久| 日韩欧美主播在线| 欧美成年人网站| 国产中文日韩欧美| 久久精品亚洲一区| 91精品国产九九九久久久亚洲| 国产欧美精品日韩精品| 久久免费观看视频| 亚洲视频在线免费看| 91老司机在线| 欧美精品少妇videofree| 久久国产精品久久久久久| 欧美裸体xxxx| 亚洲日韩欧美视频| 国内外成人免费激情在线视频| 亚洲在线观看视频| 欧美日韩亚洲视频| 欧美亚洲一级片| 亚洲欧美制服综合另类| 国产精品∨欧美精品v日韩精品| 理论片在线不卡免费观看| 国产欧美欧洲在线观看| 欧美精品九九久久| 国产精品国产自产拍高清av水多| 精品国产精品三级精品av网址| 国产成人中文字幕| 亚洲欧美国产另类| 日韩av免费一区| 国产成人精品久久久| 国产午夜一区二区| 亚洲的天堂在线中文字幕| 久久视频在线播放| 亚洲成人av资源网| 九九热这里只有精品6| 亚洲欧美日韩直播| 在线观看日韩av| 欧美日韩国产999| 亚洲福利视频久久| 久久久999精品| 欧美日韩中文字幕在线| 91精品国产综合久久香蕉的用户体验| 日韩网站免费观看高清| 国产精品三级在线| 日韩在线中文字幕| 久久久亚洲福利精品午夜| 最近2019中文字幕mv免费看| 国产综合在线视频| 96sao精品视频在线观看| 粉嫩av一区二区三区免费野| 久久69精品久久久久久久电影好| 1769国产精品| 日韩电影中文字幕| 欧美日韩第一视频| www欧美xxxx| 亚洲三级免费看| 国产精品海角社区在线观看| 国产日韩精品在线观看| 亚洲石原莉奈一区二区在线观看| 亚洲精品一区二区在线| 久久大大胆人体| 在线观看日韩www视频免费| 欧美日韩中文在线观看| 国产精品女主播视频| 亚洲国产精品成人一区二区| 亚洲国产婷婷香蕉久久久久久| 主播福利视频一区| 国产在线高清精品| 国产精品久久久久久搜索| 欧美日韩另类字幕中文| 日韩精品免费在线| 亚洲精品一区二区久| 精品福利樱桃av导航| 久久伊人精品天天| 欧美日韩电影在线观看| 久久手机免费视频| 日韩免费中文字幕| 日韩中文字幕免费| 亚洲欧美一区二区三区在线| 久久不射热爱视频精品| 亚洲毛片一区二区| 中文字幕亚洲自拍| 亚洲图片欧美日产| 国内自拍欧美激情| 欧美日韩中文在线观看| 日韩精品一二三四区| 欧美日韩中文字幕日韩欧美| 亚洲精品成人网| 精品久久久久久久久国产字幕| 亚洲欧洲国产一区| 日韩电影第一页| 欧美激情免费在线| 成人性教育视频在线观看| 中文字幕精品在线| 久久香蕉国产线看观看网| 中文字幕日韩在线观看| 亚洲精品国产精品乱码不99按摩| 亚洲综合在线中文字幕| 日韩激情视频在线| 久久91亚洲人成电影网站| 久久精品视频va| 国产精品福利在线观看网址| 亚洲欧洲国产一区| 欧美野外猛男的大粗鳮| 91热精品视频| 2024亚洲男人天堂| 欧美精品免费播放| 亚洲国产高清福利视频| 国产日韩精品电影| 亚洲va码欧洲m码| 久久精品成人欧美大片古装| 九九久久综合网站| 亚洲午夜精品久久久久久性色| 久久国产精品影视| 亚洲色图欧美制服丝袜另类第一页| 一区二区三欧美| 精品国产一区二区三区久久久狼| 日韩av中文字幕在线播放|