亚洲国产综合在线-亚洲国产综合网-亚洲国产综合人成综合网站00-亚洲国产综合久久精品-www成人国产在线观看网站-www成年人

千鋒教育-做有情懷、有良心、有品質的職業(yè)教育機構

當前位置:首頁  >  IT問答庫  >  Web基礎知識

4個Javascript 中的 for 循環(huán)-web前端基礎知識

發(fā)布:web前端基礎知識 2022-02-09 14:58

推薦答案

  4Javascript 中的 for 循環(huán) ECMAScript5(簡稱 ES5)中,有三個循環(huán)。在 2015 6 月發(fā)布的 ECMAScript6(簡稱 ES6)中,新增了一種循環(huán)類型。他們是:

·   for

·   for in

·   for each

·   for of

今天,就讓我們一起來看看這4for 循環(huán)。

4個Javascript 中的 for 循環(huán)

 

1、簡單的for循環(huán)

我們來看看最常見的寫法:

const arr = [1, 2, 3];for(let i = 0; i < arr.length; i++) {

 console.log(arr[i]);}

當循環(huán)中數(shù)組的長度沒有變化時,我們應該將數(shù)組的長度存儲在一個變量中,這樣效率會更高。下面是改進的寫法:

const arr = [1, 2, 3];for(let i = 0, len = arr.length; i <len; i++) {

 console.log(arr[i]);}

2、for-in

2.1、 使用 for-in

通常,我們可以使用for-in來遍歷數(shù)組的內容,代碼如下:

const arr = [1, 2, 3];let index;for(index in arr) {

 console.log(“arr[“ + index + “] = “ + arr[index]);}

一般來說,操作的結果如下:

arr[0] = 1arr[1] = 2arr[2] = 3

但這樣做往往會產生問題。

2.2for-in的真相

for-in 循環(huán)遍歷對象的屬性,而不是數(shù)組的索引。所以for-in遍歷的對象不限于數(shù)組,也可以遍歷對象。示例如下:

 const person = {

 fname: “san”,

 lname: “zhang”,

 age: 99};let info;for(info in person) {

 console.log(“person[“ + info + “] = “ + person[info]);}

結果如下:

person[fname] = sanperson[lname] = zhangperson[age] = 99

需要注意的是for-in遍歷屬性的順序是不確定的,即輸出結果的順序與對象中屬性的順序無關,也與屬性的字母順序無關,也沒有任何其他順序。

2.3 、關于數(shù)組的真相

數(shù)組是Javascript中的一個對象,Array的索引是屬性名。事實上,Javascript 中的數(shù)組有點誤導。

Javascript 中的數(shù)組與大多數(shù)其他語言中的數(shù)組不同。首先,Javascript 中的數(shù)組在內存中不是連續(xù)的。

其次,Array 的索引不是指偏移量。其實Array的索引不是Number類型,而是String類型。之所以能正確使用 arr[0] 之類的寫法,是因為語言可以自動改變 Number 類型。0 轉換為 String 類型的“0”

因此,Javascript 中從來沒有 Array 索引,只有“0”“1”等屬性。

有趣的是,每個 Array 對象都有一個 length 屬性,這使得它的行為更像其他語言中的數(shù)組。

但是為什么遍歷Array對象的時候不輸出length屬性呢?那是因為for-in只能遍歷可枚舉屬性length是不可枚舉屬性,實際上Array對象還有很多其他不可枚舉屬性。

現(xiàn)在,讓我們回過頭來看看使用 for-in 循環(huán)數(shù)組的例子。我們修改前面遍歷數(shù)組的例子:

const arr = [1, 2, 3];arr.name = “Hello world”;let index;for(index in arr) {

 console.log(“arr[“ + index + “] = “+ arr[index]);}

操作的結果是:

arr[0] = 1arr[1] = 2arr[2] = 3arr[name] = Hello world

我們看到 for-in 遍歷我們新的“name”屬性,因為 for-in 遍歷對象的所有屬性,而不僅僅是索引

同時,需要注意的是,這里輸出的索引值,即“0”“1”“2”不是Number類型,而是String類型,因為它們是作為屬性輸出的,不是索引,這是否意味著我們只能輸出數(shù)組的內容,而不能向我們的 Array 對象添加新屬性?答案是否定的。

因為for-in不僅遍歷數(shù)組本身的屬性,還會遍歷數(shù)組原型鏈上的所有可枚舉屬性。讓我們看一個例子:

Array.prototype.fatherName = “Father”;const arr = [1, 2, 3];arr.name = “Hello world”;let index;for(index in arr) {

 console.log(“arr[“ + index + “] = “+ arr[index]);}

操作的結果是:

arr[0] = 1arr[1] = 2arr[2] = 3arr[name] = Hello worldarr[fatherName] = Father

至此,我們可以發(fā)現(xiàn)for-in并不適合遍歷Array中的元素,它更適合遍歷對象的屬性,這也是它創(chuàng)建的初衷。有一個例外,那就是稀疏數(shù)組,閱讀以下示例:

let key;const arr = [];arr[0] = “a”;arr[100] = “b”;arr[10000] = “c”;for(key in arr) {

 if(arr.hasOwnProperty(key) &&

 /?$|^[1–9]\d*$/.test(key) &&

 key <= 4294967294

 ) {

 console.log(arr[key]);

 }}

For-in 僅遍歷現(xiàn)有實體。上例中for-in遍歷了3次(分別遍歷屬性為“0”“100”“10000”的元素,普通for循環(huán)會遍歷10001次)。因此,只要處理得當,for-in 也可以在遍歷 Array 中的元素方面發(fā)揮巨大的作用。

為了避免重復工作,我們可以包裝上面的代碼:

 function arrayHasOwnIndex(array, prop) {

 return array.hasOwnProperty(prop) &&

 /?$|^[1–9]\d*$/.test(prop) &&

 prop <= 4294967294; // 2³²-2}

用法示例如下:

for (let key in arr) {

 if (arrayHasOwnIndex(arr, key)) {

 console.log(arr[key]);

 }}

2.4for-in性能

如上所述,每次迭代操作都會同時搜索實例或原型屬性。for-in 循環(huán)的每次迭代都會產生更多的開銷,所以它比其他循環(huán)類型慢,一般速度是其他循環(huán)類型的 1/7

因此,除非您明確需要迭代具有未知數(shù)量屬性的對象,否則您應該避免使用 for-in 循環(huán)。如果需要遍歷有限數(shù)量的已知屬性列表,使用其他循環(huán)會更快,例如以下示例:

const obj = {

 “prop1”: “value1”,

 “prop2”: “value2”};const props = [“prop1”, “prop2”];for(let i = 0; i <props.length; i++) {

 console.log(obj[props[i]]);}

在上面的代碼中,對象的屬性存儲在一個數(shù)組中。與for-in搜索每個屬性相比,代碼只關注給定的屬性,節(jié)省了循環(huán)的開銷和時間。

3、forEach

ES5 中,引入了一個新循環(huán),即 forEach 循環(huán)。

const arr = [1, 2, 3];arr.forEach((data) => {

 console.log(data);});

操作結果:

123

forEach 方法對數(shù)組中包含有效值的每一項執(zhí)行一次回調函數(shù),那些已經(jīng)被刪除(使用delete 方法等)或從未賦值的項將被跳過(不包括那些未定義的項) 或空值)。回調函數(shù)會依次傳入三個參數(shù):

  • 數(shù)組中當前項的值;
  • 當前項在數(shù)組中的索引;
  • 數(shù)組對象本身;

需要注意的是,forEach 遍歷的范圍會在第一次調用回調之前確定。調用 forEach 后添加到數(shù)組的項目不會被回調訪問。

如果現(xiàn)有值發(fā)生變化,則傳遞給callback的值就是forEach遍歷它們時的值。不會遍歷已刪除的項目。

const arr = [];arr[0] = “a”;arr[3] = “b”;arr[10] = “c”;arr.name = “Hello world”;arr.forEach((data, index, array) => {

 console.log(data, index, array);});

操作結果:

a 0 [“a”, 3: “b”, 10: “c”, name: “Hello world”]b 3 [“a”, 3: “b”, 10: “c”, name: “Hello world”]c 10 [“a”, 3: “b”, 10: “c”, name: “Hello world”]

這里的索引是Number類型的,不會像for-in那樣遍歷原型鏈上的屬性。

因此,在使用forEach時,我們不需要特別聲明索引和要遍歷的元素,因為這些都是作為回調函數(shù)的參數(shù)。

另外,forEach 會遍歷數(shù)組中的所有元素,但是 ES5 定義了一些其他有用的方法,下面是一部分:

  • every:循環(huán)在第一次返回false后返回
  • some:循環(huán)在第一次返回 true 后返回
  • filter:返回一個元素滿足回調函數(shù)的新數(shù)組
  • map:在返回之前處理原始數(shù)組中的元素
  • reduce:依次處理數(shù)組中的元素,將上一次處理的結果作為下一次處理的輸入,最終得到最終結果。

forEach 性能

您可以看看jsPerf。在不同瀏覽器下測試的結果是forEach沒有for快。如果將測試代碼放在控制臺中,可能會得到不同的結果。主要原因是控制臺的執(zhí)行環(huán)境與真實的代碼執(zhí)行環(huán)境不同。

4、for-of

我們先來看一個例子:

const arr = [‘a’, ‘b’, ‘c’];for(let data of arr) {

 console.log(data);}

運行的結果是:

abc

為什么要引入for-of

要回答這個問題,我們先來看看 ES6 之前的 3 for 循環(huán)的缺陷:

forEach 不能中斷和返回;

for-in 的劣勢更加明顯。它不僅遍歷數(shù)組中的元素,還遍歷自定義屬性,甚至訪問原型鏈上的屬性。此外,遍歷數(shù)組元素的順序可以是隨機的。

所以,針對以上缺點,我們需要對原來的for循環(huán)進行改進。但是 ES6 不會破壞您已經(jīng)編寫的 JS 代碼。

目前,數(shù)以千計的網(wǎng)站依賴于 for-in 循環(huán),其中一些甚至將其用于數(shù)組遍歷。通過修復 for-in 循環(huán)來添加數(shù)組遍歷支持會使這一切變得更加混亂,因此標準委員會在 ES6 中添加了一個新的循環(huán)語法來解決當前的問題 for-of

那么 for-of 能做什么呢?

forEach相比,它可以正確響應breakcontinuereturn

for-of 循環(huán)不僅支持數(shù)組,還支持大多數(shù)類似數(shù)組的對象,例如 DOM 節(jié)點列表對象。

for-of 循環(huán)還支持字符串遍歷,它將字符串作為 Unicode 字符序列進行迭代。

for-of 還支持 Map Set(都是 ES6 中的新功能)對象遍歷。

總結一下,for-of 循環(huán)具有以下特點:

這是迭代數(shù)組元素的最簡潔直接的語法。

這種方法避免了 for-in 循環(huán)的所有陷阱。

forEach 不同,它正確響應 breakcontinue return 語句。

它不僅可以遍歷數(shù)組,還可以遍歷類數(shù)組對象和其他可迭代對象。

然而,應該注意的是,for-of 循環(huán)不支持普通對象,但是如果您想遍歷一個對象的屬性,您可以使用 for-in 循環(huán)(它就是這樣做的)。

最后,但并非最不重要的是,ES6 引入了另一種方法來迭代數(shù)組的值,那就是 Iterator。最后一個例子:

const arr = [‘a’, ‘b’, ‘c’];const iter = arr[Symbol.iterator]();iter.next() // { value: ‘a’, done: false }iter.next() // { value: ‘b’, done: false }iter.next() // { value: ‘c’, done: false }iter.next() // { value: undefined, done: true }

不過,這個內容超出了本文的范圍,Iterator 有很多要講的。

最新問答資訊

01 unity用什么編程語言?unity學習難度大嗎

學習 unity 語言
6020 人關注

02 python容易學嗎?學好python有什么好處?

學習 python 工作 培訓
5389 人關注

03 html是什么語言?html學習難嗎?

學習 html 語言 可以
5062 人關注

04 c語言難學嗎?c語言學好要多久?

語言 技術 學習
4733 人關注

06 學好平面設計要多久?報速成班靠譜嗎?

平面 設計 學習 時間
4238 人關注

相關問題

html是什么語言?html學習難嗎?

在it行業(yè)涉及到各種專業(yè)的知識,作為一個工作人員掌握一些基礎的...

前端技術有哪些?

互聯(lián)網(wǎng)行業(yè)的發(fā)展速度很快,特別是在前端這個崗位,如果不能時刻...

web前端開發(fā)需要掌握哪些知識

同時學會css,css是用來美化html頁面的為頁面提供布局和格式,最...

javascript是干什么的?JavaScript日常用途是什么

同學,你好!javascript是干什么的?JavaScript日常用途是什么?...

web前端有哪些框架?

同學您好,web前端總共有11個框架,因為web前端框架可以很大程度...

學web前端需要學什么知識

更多關于web前端培訓的問題,歡迎咨詢千鋒教育在線名師。千鋒教...

測一測
你知道多少IT梗

亚洲HAIRY多毛PICS大全| 欧洲熟妇色XXXXⅩ欧美老妇天| 香港三日本三级少妇三级视频| 国产三级国产经典国产AV| 亚洲AV无码国产剧情| 久久人搡人人玩人妻精品| 99久久国产热无码精品免费| 上边一面亲下边一面膜的功效| 国产亚洲视频在线观看播放| 一本色道久久88精品综合| 欧美人文艺术欣赏PPT背景| 国产AV无码专区亚洲AV毛网站| 亚洲AV无码国产综合专区| 老熟女HDXX中国老熟女| 被医生吃奶吃高潮了H| 午夜无码性爽快影院6080| 久久人人玩人妻潮喷内射人人| 按摩男让我高潮做了3次正常吗| 无人区码一码二码三码四码| 久久久久久久极品内射| 暗交小拗女一区二区三区| 亚洲 日韩 欧美 成人 在线| 老司机久久99久久精品播放免费 | 无人区码一码二码三码区| 久久国产精品娇妻素人| JULIA无码中文字幕一区| 无线乱码A区B区C区D| 看全色黄大色大片免费久久| 大胸美女污污污WWW网站| 亚洲国产欧美在线人成长黄瓜 | 国内精品久久久久久99蜜桃| 中文精品无码中文字幕无码专区| 乳欲人妻办公室奶水| 精品国品一二三产品区别在线观看 | 成年大片免费视频播放| 亚洲AV无码专区亚洲猫咪| 蜜桃传媒一区二区亚洲AV| 国产97色在线 | 亚洲| 亚洲熟女综合色一区二区三区| 人妻 日韩精品 中文字幕| 国产午夜精品一区二区三区漫画| 18黑白丝水手服自慰喷水网站 | 蜜桃AV无码国产丝袜在线观看| 国产97色在线 | 国| 野花香影院在线观看视频免费 | 重囗味sm在线观看无码| 熟妇一区二区三区| 久久先锋男人AV资源网站 | 中文字字幕在线中文无码| 天天看AV片在线观看| 久久亚洲精品国产亚洲老地址| 德国FREE性VIDEO极品| 亚洲综合色区另类AV| 少妇侧入内射一区二区| 久久久综合九色综合鬼色| 国产98在线 | 免费| 永久免费看照片的聊骚软件| 天堂影院一区二区三区四区| 鲁鲁夜夜天天综合视频| 国产精品99久久99久久久动漫| 又大又硬又粗再深一点视频| 四虎库影必出精品8848| 蜜桃人妻无码AⅤ中文字幕| 国产精品V片在线观看不卡| 10岁幼儿TREE小学生| 玩弄JAPAN白嫩少妇HD| 妺妺窝人体色77777777| 国产亚洲曝欧美不卡精品| WWW无套内射高清免费| 亚洲精品一区二区丝袜图片| 日韩中文无码有码免费视频| 久久久亚洲裙底偷窥综合| 国产成人精品亚洲日本专区61| 中国成熟妇女毛茸茸| 性色A码一区二区三区天美传媒| 欧美熟妇内射深插| 久久99精品久久久久久噜噜| 国产AV精品白浆一区二| 中文字幕熟妇人妻在线视频| 亚洲AV激情无码专区在线下载| 人妻精品久久无码区| 久久久久久亚洲AV无码专区| 国产成人一区二区精品视频| 99热这里有精品| 亚洲欧美日韩国产成人| 少妇风流AAAAA毛片| 男按摩师舌头伸进去了| 教官在我腿间疯狂驰聘视频| 粉嫩少妇内射浓精VIDEOS| 中文字幕日韩人妻| 亚洲国产成人五月综合网| 色噜噜天堂AV崩坏星穹铁道| 免费无码又爽又刺激激情视频软件| 国模私密浓毛150p露150p极| 吃奶摸下激烈床震视频试看| 中文字幕亚洲乱码熟女一区二区| 亚洲AV永久无码精品网址| 色一情一乱一伦一区二区三区 | 孩交乱子XXXX高清影视| 敌伦交换第11部分给了轨公领| 中文字幕精品一区二区精品| 亚洲第一天堂成人网站| 天天躁日日躁狠狠躁退| 欧洲一本到卡二卡三卡乱码| 久久无码无码久久综合综合| 国产午夜福利在线播放| 丰满妇女强高潮18ⅩXXX| 99久久国产成人免费网站| 亚洲中文字幕无码永久在线不卡 | 人人妻人人澡AV| 美女下部裸体张开腿视频| 精品国产亚洲AV麻豆| 国产高清午夜人成在线观看| おやすみせくよ晚安免费影院| 曰本A级毛片无卡免费视频VA| 亚洲AV午夜国产精品无码中文字| 丝袜高潮流白浆潮喷在线播放| 欧美一区二区在线视频人妻| 老头扒开粉嫩的小缝亲吻网站| 黑人巨大跨种族VIDEO| 国产成人综合亚洲AV第一页| 被驯服的人妻佐佐木明希| 1000部拍拍拍18勿入免费视频下载| 亚洲色偷偷综合亚洲AV| 亚洲AV成人综合网伊人APP| 四虎国产精品永久在线| 人人妻人人添人人爽日韩欧美| 女同久久精品国产99国产精品| 久久久久久精品久久久| 好爽又高潮了毛片| 国产美女在线精品免费观看| 丰满人妻妇伦又伦精品App抖| 暴躁老阿姨CSGO技巧| 99久RE热视频这里只有精品6| 婬乱丰满熟妇XXXXX| 亚洲性夜夜综合久久7777| 亚洲AV永久无码3D动漫在线观| 无码国产玉足脚交久久2020| 少妇VIDES裸体BBWWHD| 日本极品少妇XXXX| 欧美亚洲一区二区三区| 女被啪到高潮的GIF动态图无遮| 久久婷婷五月综合色和啪| 久久96国产精品久久| 狠痕鲁狠狠爱2021在| 国产一码二码三码区别| 国产精品亚洲А∨天堂2018| 国产成人无码AV片在线观看不卡| 哒哒哒WWW在线影院| 成年女人免费碰碰视频| YY8090韩国理伦片在线| CHINESE叫床国语VIDE| 99RE免费99RE在线视频| 中文字幕日产无码| 中文无码制服丝袜人妻AV| 永久免费AV无码国产网站 | 国产免费AV片在线观看| 国产成人影院一区二区三区 | 13岁幼儿3OOO| 中文字幕日韩精品有码视频| 找老女人泻火对白自拍| 幼儿HIPHOP仙踪林的功能| 伊人依成久久人综合网| 一本一道AV无码中文字幕麻豆 | 国产亚洲AV浪潮A∨尹人Av| 国产激情无码一区二区| 国产成人免费A在线视频| 国产CHINESEHDXXXX宾馆TUBE| 丰满白嫩大屁股ASS| 丰满人妻熟妇乱又伦精品软件| 东京热人妻无码人AV| 隔壁邻居是巨爆乳寡妇| 公交车上售票员用B验票小镇| 囯产精品一区二区三区线| 国产成人精品无码专区| 国产精品久久久久精品| 国产毛多水多五月激情四射| 国产男女猛烈无遮挡免费网站| 国产无人区二卡三卡四卡不见星空| 国产一产二产三精华液| 狠狠躁日日躁夜夜躁2020| 精品无码人妻一区二区三区18| 久久精品成人欧美大片| 久久人人爽人人爽人人片AV东京| 乱肉怀孕又粗又大| 男人靠女人免费视频网站| 欧美交换配乱吟粗大免费看| 欧洲精品VA无码一区二区三区| 人妻中文字幕在线| 少妇BBW搡BBBB搡| 无码夫の前で人妻を犯す| 性av 丰满av 无码av| 亚洲成av人在线观看| 亚洲一区精品无码| 中文人妻无码一区二区三区| ACCA少女SDANVI| 成人区人妻精品一区二区三区 | 男男黄Gay片免费网站www| 拍摄AV现场失控高潮数次| 日本在线 | 中文|