国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

Javascript中for循環(huán)語句的幾種寫法總結(jié)對比

2024-05-06 16:34:45
字體:
供稿:網(wǎng)友

前言

for循環(huán)我們在js遍歷對象或數(shù)組時都會有用到了,今天我們一起來看一些關(guān)于for循環(huán)的一些使用例子了,具體的操作細(xì)節(jié)如下文介紹。

一般寫法如下:

for(var i = 0;i< arr.length;i++) { var a = arr[i]; //... }

這就是一個常見的,正序循環(huán)的for循環(huán)。這樣寫的缺點大家都明白:每次都從arr里取length與i來對比,浪費性能(而且,要是arr的長度是動態(tài)變化的,就會出現(xiàn)死循環(huán))。改進這個循環(huán)的辦法是用變量保存arr.length

for(var i = 0, al = arr.length;i< al;i++) { var a = arr[i]; //... }

這樣比第一種可以略微提升點性能,要是數(shù)組長,可以提升更多。

不過這樣寫就多了個變量al,且這個變量只在用來與i對比的時候有用,看著有點雞肋。

如果循環(huán)順序?qū)δ悴恢匾悄憧梢試L試倒序循環(huán):

for(var i = arr.length-1;i > -1;i--) { var a = arr[i]; //... }

這樣一來變量少些,且還緩存過arr長度,性能也不錯。但這里的代碼寫得有點拙劣(我故意的),首先是i = arr.length-1(居然要-1,靠),然后是循環(huán)繼續(xù)執(zhí)行的條件i > -1,都讓有潔癖的人無法忍受。

下面是我常用的倒序for循環(huán)寫法:

for(var i = arr.length;i--;) { var a = arr[i]; //... }

這已經(jīng)非常精簡了。原理需要理解一下:for循環(huán)繼續(xù)執(zhí)行的條件,是;;之間的這個判斷要為真,而這里的i–,在第一次循環(huán)進來的時候,i=arr.length,i–值不變(為什么不變?因為要在for循環(huán)體里面,才會發(fā)現(xiàn)i變了);當(dāng)i=1時,i- -還是1,但進入循環(huán)體后,就是0了,所以可以正常執(zhí)行最后一次循環(huán);當(dāng)i=0時,i–還是0,而0已經(jīng)不為真了,所以循環(huán)就不會繼續(xù)執(zhí)行了。

大家注意到上面的所有代碼的for循環(huán)體里,都有個var a = arr[i] ,用來取出當(dāng)前循環(huán)到的數(shù)組項。這實際上也是種浪費,且jsLint等會告訴你:不要在循環(huán)里聲明變量。。。

倒序的for可以精簡至斯,但我就是要正序,而且要效率高,變量少,怎么辦?

如下:

for(var i = 0, a;a = arr[i++];) { //... }

這種寫法好處在于:幾乎不可避免的arr.length不見了,前面說的取出當(dāng)前循環(huán)到的數(shù)組項的那一句也不見了。

原理:

a = arr[i++] ,在這里作為循環(huán)能執(zhí)行的條件,注意這里只有一個=號,所以這不是判斷句,是賦值語句,就是把arr[i++]賦給a,然后判斷a是不是真值。i++與i–的原理類型我就不說了,只說當(dāng)i++已經(jīng)超過數(shù)組的長度時,循環(huán)肯定要停止才行,而這里真的就停止了,為什么?因為a=arr[i++] ,如果取到了超出數(shù)組本身長度的項,只會取得一個undefined,而undefined是假值,循環(huán)條件就判斷失敗了。

當(dāng)然,這樣寫的缺點也很明顯:

     1,當(dāng)arr的長度動態(tài)變化時,依然會產(chǎn)生死循環(huán)————因為我們從來沒緩存過arr.length呀。

     2,如果循環(huán)的是一個數(shù)字?jǐn)?shù)組,當(dāng)取出的項(即a的值)為0時,就會中止循環(huán)(因為0是假值)。

     3,當(dāng)數(shù)組中某一項是假值時(包括空字符串,0,null,undefined),同樣會中止循環(huán)

所以大家用這種寫法時,最好排除掉上面的情況再用。

這個原理同樣可以用在倒序循環(huán)上。

最后我要忠告大家?guī)拙洌?/strong>

  1. 代碼精簡不等于效率高!
  2. 不要為了故意精簡代碼而喪失性能

順帶說幾點提高for循環(huán)性能的要點:

     1,適時break!不需要遍歷全部的就要加跳出條件!

     2,不要在for循環(huán)體里聲明變量(建議一次var,多次賦值)

     2,數(shù)組長度緩存,盡量少變量

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如有疑問大家可以留言交流。


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 武乡县| 金乡县| 白玉县| 裕民县| 马山县| 临澧县| 晋州市| 平湖市| 临澧县| 邵阳市| 阿勒泰市| 栾城县| 会理县| 望谟县| 泌阳县| 砚山县| 海盐县| 阿拉善盟| 黄骅市| 涟源市| 屯留县| 宁安市| 大新县| 岑巩县| 河西区| 宿迁市| 丹阳市| 德格县| 仁化县| 雷州市| 肥东县| 四子王旗| 祁连县| 临洮县| 昭通市| 日照市| 文昌市| 渝北区| 万山特区| 鹤山市| 宜阳县|