国产高清在线免费观看-国产高清在线免费无码-国产高清在线男人的天堂-国产高清在线视频-国产高清在线视频精品视频-国产高清在线视频伊甸园

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

強(qiáng)壯的isArray函數(shù)

admin
2010年8月13日 23:10 本文熱度 4701



在日常開(kāi)發(fā)中,我們經(jīng)常需要判斷某個(gè)對(duì)象是否是數(shù)組類型的,在js中檢測(cè)對(duì)象類型的常見(jiàn)的方法有幾種:


1、typeof操作符。對(duì)于Function、String、Number、Undefined這幾種類型的對(duì)象來(lái)說(shuō),不會(huì)有什么問(wèn)題,但是針對(duì)Array的對(duì)象就沒(méi)什么用途了:


Js代碼
var a = new Array(); // “object”
var b = function(){}; // “function”
var c = null; // “object”
var d = 4; // “number”
var e = ’sfsd’; // “string”
var f = undefined; // “object”


2、instanceof操作符。此操作符檢測(cè)對(duì)象的原型鏈?zhǔn)欠裰赶驑?gòu)造函數(shù)的prototype對(duì)象,恩,聽(tīng)起來(lái)不錯(cuò),應(yīng)該可以解決我們的數(shù)組檢測(cè)問(wèn)題:


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


3、對(duì)象的constructor屬性。除了instanceof,我們還可以利用每個(gè)對(duì)象都具有constructor的屬性來(lái)判斷其類型,于是乎我們可以這樣做:


Js代碼


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


貌似后兩個(gè)解決方案是無(wú)懈可擊的,但真的是這樣么?天有不測(cè)風(fēng)云,當(dāng)你在多個(gè)frame中來(lái)回穿梭的時(shí)候,令人沮喪的問(wèn)題出現(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í)例化的對(duì)象彼此是不共享原型鏈的,因此導(dǎo)致上述檢測(cè)代碼失效!怎么辦怎么辦??嗯,javascript是動(dòng)態(tài)語(yǔ)言,或許萬(wàn)金油“鴨式辨型”(duck type)可以助我們一臂之力“如果它走起路來(lái)像鴨子,叫起來(lái)也像鴨子,那就當(dāng)他是鴨子吧”,同理,可以檢測(cè)某些數(shù)組對(duì)象特有的能力來(lái)做判斷,這個(gè)法子已經(jīng)有人用了,比如Prototype框架,來(lái)看看它實(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:“嗯,沒(méi)錯(cuò)我有!”
isArray:“好吧,那你就是個(gè)數(shù)組了,哪怕你是冒充的,囧……”


Js代碼


var trickster = { splice: 1, join: 2 };
Object.isArray(trickster); // 假冒成功,耶


沒(méi)錯(cuò),這個(gè)解決方案給人的感覺(jué)有點(diǎn)別扭,任何一個(gè)具有’splice’和’join’屬性的對(duì)象都能通過(guò)這個(gè)檢測(cè)!怎么辦怎么辦怎么辦??別著急,仔細(xì)想想,其實(shí)我們需要的是一個(gè)能取得對(duì)象實(shí)際類型,而且又能跨frame使用的方法即可。這不,細(xì)心的老外在翻閱ECMA262標(biāo)準(zhǔn)的時(shí)候發(fā)現(xiàn)了這個(gè)(btw,我也看了,怎么就沒(méi)發(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 “]”.
3. Return Result (2)


上面的規(guī)范定義了Object.prototype.toString的行為:首先,取得對(duì)象的一個(gè)內(nèi)部屬性[[Class]],然后依據(jù)這個(gè)屬性,返回一個(gè)類似于”[object Array]“的字符串作為結(jié)果(看過(guò)ECMA標(biāo)準(zhǔn)的應(yīng)該都知道,[[]]用來(lái)表示語(yǔ)言內(nèi)部用到的、外部不可直接訪問(wèn)的屬性,稱為“內(nèi)部屬性”)。利用這個(gè)方法,再配合call,我們可以取得任何對(duì)象的內(nèi)部屬性[[Class]],然后把類型檢測(cè)轉(zhuǎn)化為字符串比較,以達(dá)到我們的目的。還是先來(lái)看看在 ECMA標(biāo)準(zhǔn)中Array的描述吧:


ECMA-262 寫道


new Array([ item0[, item1 [,…]]])
The [[Class]] property of the newly constructed object is set to “Array”.


于是乎,可以改寫之前的isArray函數(shù)以利用這個(gè)特性,如下:


function isArray(o) {
return Object.prototype.toString.call(o) === ‘[object Array]‘;
}


call改變toString的this引用為待檢測(cè)的對(duì)象,返回此對(duì)象的字符串表示,然后對(duì)比此字符串是否是’[object Array]‘,以判斷其是否是Array的實(shí)例。也許你要問(wèn)了,為什么不直接o.toString()?嗯,雖然Array繼承自O(shè)bject,也會(huì)有 toString方法,但是這個(gè)方法有可能會(huì)被改寫而達(dá)不到我們的要求,而Object.prototype則是老虎的屁股,很少有人敢去碰它的,所以能一定程度保證其“純潔性”:)


與前面幾個(gè)方案不同,這個(gè)方法很好的解決了跨frame對(duì)象構(gòu)建的問(wèn)題,經(jīng)過(guò)測(cè)試,各大瀏覽器兼容性也很好,可以放心使用。一個(gè)好消息是,很多框架,比如jQuery、Base2等等,都計(jì)劃借鑒此方法以實(shí)現(xiàn)某些特殊的,比如數(shù)組、正則表達(dá)式等對(duì)象的類型判定,不用我們自己寫了。


該文章在 2010/8/13 23:10:33 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 亚洲专区不卡中文字幕人成乱码熟女 | 亚洲精品欧美综合二区 | 亚洲另类中文字幕 | 中文字幕亚洲制服丝袜无码 | 亚洲精品无码成人久久影院 | 亚洲高清无码在线 视频 | 麻豆国产一卡二卡三卡不卡 | 中文字幕无码日韩专区 | 日韩久久精品免费一区二区 | 日韩视频中文字幕精品偷拍 | 伊人久久精品无码av一区 | 亚洲中文字无幕码中文字 | 亚洲自拍欧美日韩丝袜 | 欧美日韩亚洲国产专区 | 国产高清av在线播放 | 亚洲综合色自拍一区 | 亚洲综合国产中文字幕 | 日本天堂免费观看 | 欧美国产大片 | 自拍亚洲综合精品 | 在线日韩日本国产亚洲 | 亚洲一区二区三区一品精 | 精品国产一区二区三区观看不卡 | 2025国产精品手机在线观看 | 国产日产精品_国产精品毛片 | 国产女人被搞高潮视频一区二区 | 日韩制服国产精品一区 | 一区二区自拍 | 成人午夜羞羞爽爽视频欧美 | 日韩gay小鲜肉啪啪18禁 | 日韩喷潮视频一区二区 | 麻豆av在线一区二区 | 一本加勒比hezyo无码专区 | 88久久精品无码一区二区毛片 | 国产免费久久精品国产传媒 | 欧洲亚洲1卡二卡三卡2025 | 精品日产卡一卡二卡三入口 | 国产在线视频国产永久视频 | 日本少妇高潮喷水视频 | 亚洲自偷自偷图片自拍 | 成人免费无码视频在线网站 |