狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

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

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

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



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


1、typeof操作符。對(duì)于Function、String、Number、Undefined這幾種類(lèi)型的對(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)判斷其類(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í)際類(lèi)型,而且又能跨frame使用的方法即可。這不,細(xì)心的老外在翻閱ECMA262標(biāo)準(zhǔn)的時(shí)候發(fā)現(xiàn)了這個(gè)(btw,我也看了,怎么就沒(méi)發(fā)現(xiàn)這個(gè)用途呢,囧):


ECMA-262 寫(xiě)道


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è)類(lèi)似于”[object Array]“的字符串作為結(jié)果(看過(guò)ECMA標(biāo)準(zhǔn)的應(yīng)該都知道,[[]]用來(lái)表示語(yǔ)言內(nèi)部用到的、外部不可直接訪問(wèn)的屬性,稱(chēng)為“內(nèi)部屬性”)。利用這個(gè)方法,再配合call,我們可以取得任何對(duì)象的內(nèi)部屬性[[Class]],然后把類(lèi)型檢測(cè)轉(zhuǎn)化為字符串比較,以達(dá)到我們的目的。還是先來(lái)看看在 ECMA標(biāo)準(zhǔn)中Array的描述吧:


ECMA-262 寫(xiě)道


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


于是乎,可以改寫(xiě)之前的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ì)被改寫(xiě)而達(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ì)象的類(lèi)型判定,不用我們自己寫(xiě)了。


該文章在 2010/8/13 23:10:33 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(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)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(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