大家都知道在JavaScript中提供了兩種方式迭代對象:
一、for循環(huán)
不足:
在于每次循環(huán)的時候數(shù)組的長度都要去獲??;
終止條件要明確;
在for循環(huán)中,你可以循環(huán)取得數(shù)組或是數(shù)組類似對象的值,譬如arguments和HTMLCollection對象。通常的循環(huán)形式如下:
// 次佳的循環(huán)for (var i = 0; i < myarray.length; i++) { // 使用myarray[i]做點(diǎn)什么}這種形式的循環(huán)的不足在于每次循環(huán)的時候數(shù)組的長度都要去獲取下。這回降低你的代碼性能,尤其當(dāng)myarray不是數(shù)組,而是一個HTMLCollection對象的時候。
HTMLCollections指的是DOM方法返回的對象,例如:
document.getElementsByName()
document.getElementsByClassName()
document.getElementsByTagName()
還有其他一些HTMLCollections,這些是在DOM標(biāo)準(zhǔn)之前引進(jìn)并且現(xiàn)在還在使用的。有:
document.images: 頁面上所有的圖片元素
document.links : 所有a標(biāo)簽元素
document.forms : 所有表單
document.forms[0].elements : 頁面上第一個表單中的所有域
集合的麻煩在于它們實(shí)時查詢基本文檔(HTML頁面)。這意味著每次你訪問任何集合的長度,你要實(shí)時查詢DOM,而DOM操作一般都是比較昂貴的。
這就是為什么當(dāng)你循環(huán)獲取值時,緩存數(shù)組(或集合)的長度是比較好的形式,正如下面代碼顯示的:
for (var i = 0, max = myarray.length; i < max; i++) { // 使用myarray[i]做點(diǎn)什么}這樣,在這個循環(huán)過程中,你只檢索了一次長度值。
在所有瀏覽器下,循環(huán)獲取內(nèi)容時緩存HTMLCollections的長度是更快的,2倍(Safari3)到190倍(IE7)之間。//此數(shù)據(jù)貌似很老
注意到,當(dāng)你明確想要修改循環(huán)中的集合的時候(例如,添加更多的DOM元素),你可能更喜歡長度更新而不是常量。
伴隨著單var形式,你可以把變量從循環(huán)中提出來,就像下面這樣:
function looper() { var i = 0, max, myarray = []; // ... for (i = 0, max = myarray.length; i < max; i++) { // 使用myarray[i]做點(diǎn)什么 }}這種形式具有一致性的好處,因?yàn)槟銏猿至藛我籿ar形式。不足在于當(dāng)重構(gòu)代碼的時候,復(fù)制和粘貼整個循環(huán)有點(diǎn)困難。例如,你從一個函數(shù)復(fù)制了一個循環(huán)到另一個函數(shù),你不得不去確定你能夠把i和max引入新的函數(shù)(如果在這里沒有用的話,很有可能你要從原函數(shù)中把它們刪掉)。
最后一個需要對循環(huán)進(jìn)行調(diào)整的是使用下面表達(dá)式之一來替換i++。
i = i + 1i += 1
JSLint提示您這樣做,原因是++和 主站蜘蛛池模板: 宁南县| 苏州市| 晴隆县| 赤峰市| 鄂伦春自治旗| 阿克| 承德县| 江津市| 翼城县| 五寨县| 黎城县| 富源县| 留坝县| 航空| 汾阳市| 临沧市| 嘉兴市| 抚远县| 石泉县| 铜山县| 巩义市| 东辽县| 二连浩特市| 仪征市| 清丰县| 湖北省| 峨山| 磐安县| 卓资县| 尉犁县| 屯门区| 雷山县| 驻马店市| 东阳市| 若羌县| 南丰县| 拉萨市| 环江| 崇文区| 宁晋县| 开鲁县|