前言
遍歷數(shù)組或?qū)ο笫且幻绦騿T的基本素養(yǎng)之一. 然而遍歷卻不是一件簡(jiǎn)單的事, 優(yōu)秀的程序員知道怎么去選擇合適的遍歷方法, 優(yōu)化遍歷效率. 本篇將帶你走進(jìn)JavaScript遍歷的世界, 享受分析JS循環(huán)的快感. 本篇所有代碼都可以直接運(yùn)行, 希望您通讀本篇后, 不止是瀏覽, 最好是親手去實(shí)踐下.
概述
js有如下兩種數(shù)據(jù)需要經(jīng)常遍歷
數(shù)組(Array) 對(duì)象(Object)同時(shí)又提供了如下8種方法方便我們遍歷元素
for while(或do~while) forEach for in $.each $(selecter).each map every最終我們將分析遍歷效率選出最佳遍歷選手.
本文將針對(duì)如下兩種數(shù)據(jù)進(jìn)行詳細(xì)的分析和舉栗. 下面舉栗中如果不加特殊說(shuō)明將會(huì)用到如下數(shù)據(jù).
var array = ["囚徒","過(guò)客","領(lǐng)袖"];//職場(chǎng)3種人var o = {0:"linda",1:"style",2:"nick",length:3};for
語(yǔ)法: for(初始化; 循環(huán)執(zhí)行條件; 每遍歷一個(gè)元素后做的事情;){}
(function(){//循環(huán)置于閉包之內(nèi) for(var i=0,length=array.length;i<length;i++){//緩存數(shù)組長(zhǎng)度 console.log(array[i]);//內(nèi)部方法若有可能相互影響,也要置于閉包之內(nèi) }})();for循環(huán)只能遍歷數(shù)組, 不能遍歷對(duì)象. 寫(xiě)for循環(huán)時(shí)有兩點(diǎn)需要注意.
其一, 為了避免遍歷時(shí)執(zhí)行多遍計(jì)算數(shù)組長(zhǎng)度的操作, 影響效率, 建議在循環(huán)開(kāi)始以變量的形式緩存下數(shù)組長(zhǎng)度, 若在循環(huán)內(nèi)部有可能改變數(shù)組長(zhǎng)度, 請(qǐng)務(wù)必慎重處理, 避免數(shù)組越界. JavaScript中并沒(méi)有類(lèi)似java的塊級(jí)作用域, for循環(huán)內(nèi)部定義的變量會(huì)直接暴露在外(如 i,循環(huán)退出后,i變量將等于數(shù)組長(zhǎng)度, 后續(xù)代碼將能訪問(wèn)到 i 變量的值), 因此建議將for循環(huán)置于閉包內(nèi). 特別要注意的是: 如果在循環(huán)內(nèi)部, 前一個(gè)元素的遍歷有可能影響到后一個(gè)元素的遍歷, 那么for循環(huán)內(nèi)部方法也需要置于閉包之內(nèi).do/while
語(yǔ)法: do{...}while(true);
do while(function() { var i = 0, len = array.length; do { if (i == 2) { break; // 循環(huán)被終止, 此處如果是continue就會(huì)造成循環(huán)無(wú)法退出 }; console.log('array['+ i +']:' + array[i]); i++;//此句建議放置循環(huán)while頭部 } while(i<len);})();do/while的語(yǔ)法簡(jiǎn)化了循環(huán)的實(shí)現(xiàn), 只保留對(duì)循環(huán)條件的判斷, 所以我們要在循環(huán)內(nèi)部構(gòu)造出循環(huán)退出的條件, 否則有可能造成死循環(huán). 特別要注意的是: 使用 continue 跳出本次遍歷時(shí), 要保證循環(huán)能夠自動(dòng)進(jìn)入到下一次遍歷, 因此保證循環(huán)走到下一次遍歷的語(yǔ)句需要放到 continue 前面執(zhí)行, 建議置于循環(huán)頭部.(如上, i++ 語(yǔ)句最好放置循環(huán)頭部)
do/while 循環(huán)與for循環(huán)大體差不多,只支持?jǐn)?shù)組遍歷, 多用于對(duì)循環(huán)退出條件不是很明確的場(chǎng)景. 一般來(lái)說(shuō)不建議使用這種方式遍歷數(shù)組.
新聞熱點(diǎn)
疑難解答
圖片精選