欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Javascript技巧之不要用for in語句對數(shù)組進行遍歷

 更新時間:2010年10月20日 01:28:52   作者:  
Javascript技巧-不要用for in語句對數(shù)組進行遍歷的一些原因分析,需要的朋友可以參考下。
一,為什么不要用for in語句

jqModal這個jquery插件估計很多人都使用過,在jqModal源碼內(nèi)部,有一個函數(shù)為hs,其中有個嵌套循環(huán)如下,
復制代碼 代碼如下:

for(var i in {jqmShow:1,jqmHide:1})
for(var s in this[i])
if(H[this[i][s]])
H[this[i][s]].w[i](this);
return F;
}

第一個for in遍歷的目標是個匿名對象,沒有問題。
第二個for in遍歷,根據(jù)上下文確認this[i]是一個數(shù)組對象(Array)。
很多JS先驅(qū)者都告誡過我們不要對數(shù)組對象使用for in語句進行遍歷,原因除了性能外,還有可能產(chǎn)生意料之內(nèi)的bug。不聽先人言,吃虧在眼前呵呵。
今天偶拿jqModal為例,說明下這種bug到底什么時候會出現(xiàn),當引以為戒。
二,問題重現(xiàn)
關(guān)鍵詞:原生Array類、擴展Array類
for in 語句對數(shù)組對象進行遍歷潛在的bug在于:如果原生Array類被其他的js腳本庫進行了原型擴展(比如多加一個toJSON方法即Array.prototype.toJSON=xxxx),那么用for in遍歷擴展后的Array對象的邏輯將與遍歷原生Array對象的邏輯發(fā)生差異。
舉個簡單的例子,

復制代碼 代碼如下:

var x=[1];
for(var s in x){
alert(s);
};

按常理,如果Array是原生js類,上面語句應該只執(zhí)行一次alert方法,且s為數(shù)組的索引0。但是,如果Array類被擴展了,多了一個toJSON方法,那么上面的語句將執(zhí)行兩次alert,第一次s為索引0,第二次s為方法名'toJSON'。

如果你設計的代碼的邏輯以原生Array類為基準,在某一天你的同事在頁面里面引用了一個第三方的JS庫,這個庫又恰好擴展了Array類,結(jié)果將難以想象,很有可能原來的代碼邏輯將不再成立。

關(guān)于這種擴展原生JS類的庫,很有名的一個就是prototype.js,它給Array類擴展了很多方法諸如toJSON,each等等。我現(xiàn)在明白為啥jquery的創(chuàng)始人曾經(jīng)對prototype火大了(不少人因為特殊原因在一個頁面里用jquery同時又用prototype,會有很多意料之外的沖突問題,僅僅一個noConflict是無法解決的)。另外,jqModal的作者如果看得懂我這篇文章估計也會對埋怨prototype,說:“我用for in對數(shù)組遍歷是不明智的,但是更該死的還是prototype。。。”

如上所述,如果你在用jqModal,同時因為別的原因在用prototype,恭喜你中招了。沖突將導致jqModal的彈框在ie6、ie7下面將無法利用closeClass設置的按鈕進行自動關(guān)閉。跟蹤調(diào)試代碼你將發(fā)現(xiàn),異常的地方就在本文開頭提到的hs方法的for in 循環(huán)中。。。
三,解決問題
遍歷數(shù)組的地方,用for var 語句代替for in。

相關(guān)文章

  • servlet+jquery實現(xiàn)文件上傳進度條示例代碼

    servlet+jquery實現(xiàn)文件上傳進度條示例代碼

    現(xiàn)在文件的上傳,特別是大文件上傳,都需要進度條。這篇文章主要介紹了servlet+jquery實現(xiàn)文件上傳進度條示例代碼,有興趣的可以了解一下。
    2017-01-01
  • JQuery 1.3.2以上版本中出現(xiàn)pareseerror錯誤的解決方法

    JQuery 1.3.2以上版本中出現(xiàn)pareseerror錯誤的解決方法

    最近正在做一個系統(tǒng),測試組那邊不停的報告bug:后臺、前臺各種列表報告js彈出窗錯誤,內(nèi)容僅僅是一句“pareseerror”!
    2011-01-01
  • jQuery EasyUI 中文API Button使用實例

    jQuery EasyUI 中文API Button使用實例

    jQuery EasyUI 中文API Button使用小結(jié),需要的朋友可以參考下。
    2010-04-04
  • cookie中的path與domain屬性詳解

    cookie中的path與domain屬性詳解

    本篇文章主要是對cookie中的path與domain屬性進行了詳細的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • 基于jquery實現(xiàn)下拉框美化特效

    基于jquery實現(xiàn)下拉框美化特效

    這篇文章主要為大家詳細介紹了基于jquery實現(xiàn)下拉框美化特效的示例代碼,以一個完整的實例進行分析講解,感興趣的小伙伴們可以參考一下
    2016-02-02
  • jQuery+CSS3實現(xiàn)點贊功能

    jQuery+CSS3實現(xiàn)點贊功能

    本篇文章主要介紹了jQuery+CSS3實現(xiàn)點贊功能的示例代碼。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • jQuery選擇器全集詳解

    jQuery選擇器全集詳解

    本文結(jié)合圖文代碼,基本上將所有的jQuery選擇器都講解了一遍,非常的詳盡,希望對大家能有所幫助。
    2014-11-11
  • JQuery記住用戶名密碼實現(xiàn)下次自動登錄功能

    JQuery記住用戶名密碼實現(xiàn)下次自動登錄功能

    這篇文章主要介紹了JQuery記住用戶名密碼實現(xiàn)下次自動登錄功能,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-04-04
  • 基于jquery自定義圖片熱區(qū)效果

    基于jquery自定義圖片熱區(qū)效果

    前陣子接到個需求,聯(lián)通網(wǎng)上營業(yè)廳經(jīng)常需要專題頁面做宣傳,但是由于專題頁面會有按鈕,以及各個圖片的鏈接,省分的人沒有html基礎,沒人維護,量又比較大,需要開發(fā)出一個可自定義圖片熱區(qū)鏈接的后臺,于是就有了這個
    2012-07-07
  • jQuery鼠標滑過橫向時間軸樣式(代碼詳解)

    jQuery鼠標滑過橫向時間軸樣式(代碼詳解)

    這篇文章主要介紹了jQuery鼠標滑過橫向時間軸樣式,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11

最新評論