国产91精品露脸国语对白-国产91精品系列在线观看-国产91精品一区-国产91精品一区二区-精品视频免费看-精品视频免费观看

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

當(dāng)前位置:首頁(yè)  >  IT問(wèn)答庫(kù)  >  Web基礎(chǔ)知識(shí)

4個(gè)Javascript 中的 for 循環(huán)-web前端基礎(chǔ)知識(shí)

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

推薦答案

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

·   for

·   for in

·   for each

·   for of

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

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

 

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

我們來(lái)看看最常見(jiàn)的寫(xiě)法:

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

 console.log(arr[i]);}

當(dāng)循環(huán)中數(shù)組的長(zhǎng)度沒(méi)有變化時(shí),我們應(yīng)該將數(shù)組的長(zhǎng)度存儲(chǔ)在一個(gè)變量中,這樣效率會(huì)更高。下面是改進(jìn)的寫(xiě)法:

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來(lái)遍歷數(shù)組的內(nèi)容,代碼如下:

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

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

一般來(lái)說(shuō),操作的結(jié)果如下:

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

但這樣做往往會(huì)產(chǎn)生問(wèn)題。

2.2for-in的真相

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

 const person = {

 fname: “san”,

 lname: “zhang”,

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

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

結(jié)果如下:

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

需要注意的是for-in遍歷屬性的順序是不確定的,即輸出結(jié)果的順序與對(duì)象中屬性的順序無(wú)關(guān),也與屬性的字母順序無(wú)關(guān),也沒(méi)有任何其他順序。

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

數(shù)組是Javascript中的一個(gè)對(duì)象,Array的索引是屬性名。事實(shí)上,Javascript 中的數(shù)組有點(diǎn)誤導(dǎo)。

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

其次,Array 的索引不是指偏移量。其實(shí)Array的索引不是Number類型,而是String類型。之所以能正確使用 arr[0] 之類的寫(xiě)法,是因?yàn)檎Z(yǔ)言可以自動(dòng)改變 Number 類型。0 轉(zhuǎn)換為 String 類型的“0”

因此,Javascript 中從來(lái)沒(méi)有 Array 索引,只有“0”“1”等屬性。

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

但是為什么遍歷Array對(duì)象的時(shí)候不輸出length屬性呢?那是因?yàn)?/font>for-in只能遍歷可枚舉屬性length是不可枚舉屬性,實(shí)際上Array對(duì)象還有很多其他不可枚舉屬性。

現(xiàn)在,讓我們回過(guò)頭來(lái)看看使用 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]);}

操作的結(jié)果是:

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

我們看到 for-in 遍歷我們新的“name”屬性,因?yàn)?for-in 遍歷對(duì)象的所有屬性,而不僅僅是索引

同時(shí),需要注意的是,這里輸出的索引值,即“0”“1”“2”不是Number類型,而是String類型,因?yàn)樗鼈兪亲鳛閷傩暂敵龅模皇撬饕@是否意味著我們只能輸出數(shù)組的內(nèi)容,而不能向我們的 Array 對(duì)象添加新屬性?答案是否定的。

因?yàn)?/font>for-in不僅遍歷數(shù)組本身的屬性,還會(huì)遍歷數(shù)組原型鏈上的所有可枚舉屬性。讓我們看一個(gè)例子:

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]);}

操作的結(jié)果是:

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

至此,我們可以發(fā)現(xiàn)for-in并不適合遍歷Array中的元素,它更適合遍歷對(duì)象的屬性,這也是它創(chuàng)建的初衷。有一個(gè)例外,那就是稀疏數(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)有實(shí)體。上例中for-in遍歷了3次(分別遍歷屬性為“0”“100”“10000”的元素,普通for循環(huán)會(huì)遍歷10001次)。因此,只要處理得當(dāng),for-in 也可以在遍歷 Array 中的元素方面發(fā)揮巨大的作用。

為了避免重復(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性能

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

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

const obj = {

 “prop1”: “value1”,

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

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

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

3、forEach

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

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

 console.log(data);});

操作結(jié)果:

123

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

  • 數(shù)組中當(dāng)前項(xiàng)的值;
  • 當(dāng)前項(xiàng)在數(shù)組中的索引;
  • 數(shù)組對(duì)象本身;

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

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

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);});

操作結(jié)果:

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類型的,不會(huì)像for-in那樣遍歷原型鏈上的屬性。

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

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

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

forEach 性能

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

4、for-of

我們先來(lái)看一個(gè)例子:

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

 console.log(data);}

運(yùn)行的結(jié)果是:

abc

為什么要引入for-of

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

forEach 不能中斷和返回;

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

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

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

那么 for-of 能做什么呢?

forEach相比,它可以正確響應(yīng)breakcontinuereturn

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

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

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

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

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

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

forEach 不同,它正確響應(yīng) breakcontinue return 語(yǔ)句。

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

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

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

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 }

不過(guò),這個(gè)內(nèi)容超出了本文的范圍,Iterator 有很多要講的。

最新問(wèn)答資訊

01 unity用什么編程語(yǔ)言?unity學(xué)習(xí)難度大嗎

學(xué)習(xí) unity 語(yǔ)言
6020 人關(guān)注

02 python容易學(xué)嗎?學(xué)好python有什么好處?

學(xué)習(xí) python 工作 培訓(xùn)
5389 人關(guān)注

03 html是什么語(yǔ)言?html學(xué)習(xí)難嗎?

學(xué)習(xí) html 語(yǔ)言 可以
5062 人關(guān)注

04 c語(yǔ)言難學(xué)嗎?c語(yǔ)言學(xué)好要多久?

語(yǔ)言 技術(shù) 學(xué)習(xí)
4733 人關(guān)注

06 學(xué)好平面設(shè)計(jì)要多久?報(bào)速成班靠譜嗎?

平面 設(shè)計(jì) 學(xué)習(xí) 時(shí)間
4238 人關(guān)注

相關(guān)問(wèn)題

測(cè)一測(cè)
你知道多少IT梗

老熟女媾交系列群| АV天堂手机版在线观看| 强壮公的侵犯让我高潮不断| 国产AⅤ激情无码久久| 亚洲少妇XXXXX| 日本丰满熟妇55乱偷| 黑人巨大进入白人美女视频| ASIANMATURE老熟妇女| 无码人妻一区二区三区免费看成人| 久久天天躁狠狠躁夜夜AV不卡| 大伊香蕉在线精品视频75| 亚洲色成人WWW永久网站| 日韩成视频在线精品| 精品人亚洲成A人片在线观看无码专区| XXXX性×XX老少配| 亚洲AV永久无码精品三区在线4| 欧美黑人巨大VIDEOS极品| 国产无套码AⅤ在线观看| 99久久亚洲精品无码毛片| 性色欲情网站IWWW九文堂| 女生输了给对方玩一个月| 国产美女遭强高潮开双腿| 97免费公开在线视频| 亚洲AV成人一区二区三区在线看 | 公在客厅里吃我的奶涨奶视频 | 无码一区在线视频| 免费光看午夜请高视频| 国产伦精品免编号公布| 99久久久国产精品消防器材| 亚洲AV无码ⅤS国产AV| 人妻丰满熟妇av无码 | 四虎影库884AA.WWW| 脔到她哭H粗话H好爽五星视频| 国产精品第一区揄拍无码| √BT天堂网WWW中文在线| 亚欧乱色国产精品免费九库| 欧美做受又硬又粗又大视频| 精品欧美一区二区三区久久久| 成人爽A毛片在线视频淮北| 亚洲中文字幕无码爆乳| 天美传媒免费观看一二三在线| 免费A级毛片在线看| 国内精品自线一区二区三区2| 被两个两个黑人吃奶4P| 野花おっさんとわたし| 无码口爆内射颜射后入| 欧美最婬乱婬爆婬牲视| 久久精品AⅤ无码中文字字幕| 国产AV日韩AⅤ亚洲AV无码馆| 50妺妺窝人体色www合集| 亚洲AV综合色区无码一区偷拍| 日韩一区二区三区四区| 美女裸体18禁免费网站| 国内揄拍国内精品| 东北骚妇老熟女DHXⅩXXX| 中文在线天堂А√在线| 亚洲AV无码片一区二区三区| 日日碰狠狠添天天爽超碰97| 蜜臀av一区二区三区久久| 韩漫嘿啾漫画进入| 俄罗斯性孕妇孕交| 97人妻天天爽夜夜爽二区| 亚洲另类激情综合偷自拍图片| 熟女俱乐部五十路二区AV| 欧美成人高清AⅤ免费观看| 精品视频国产香蕉尹人视频| 国产成人精品久久综合| JAPANESE55丰满成熟| 亚洲综合久久无码色噜噜赖水 | 成人网站亚洲二区乱码| 中文字幕无码毛片免费看| 亚洲第一无码AV无码专区| 色欲久久久天天天综合网| 女人下边被添全过视频| 久久精品国产亚洲ΑV忘忧草| 国产蜜芽尤物在线一区| 成人亚洲AV日韩AV欧v| 98精产国品一二三产区区| 亚洲香蕉成人AV网站在线观看| 午夜射精日本三级| 搡BBBB槡BBBB| 欧美最婬乱婬爆婬牲视| 美女裸体无遮拦国产兔费网站| 皇上骑带木棒的早朝| 国产精品久久久久久久久软件| 把腿张开老子臊烂你在线观看| 中文亚洲AV片在线观看无码| 亚洲欧洲日产国码无码APP| 性少妇FREESEXVIDEO| 熟妇高潮一区二区精品| 人妻一区二区在线| 内射女校花一区二区三区| 久久久人人人婷婷色东京热| 好男人WWW在线观看视频| 国产精品JIZZ在线观看老狼| 餐桌下他深深顶撞H| AV无码精品久久久久精品免费 | 亚洲 小说 欧美 激情 另类| 少妇又色又紧又爽又刺激视频| 青草伊人久久综在合线亚洲观看| 美女内射毛片在线看免费人动物| 久久精品国产自清天天线| 国产亚洲欧洲综合5388| 国产精品扒开腿做爽爽爽日本无码| 成AV人电影在线观看| AV无码AV在线A∨天堂APP| 中文无码一区二区视频在线播放量| 亚洲人成线无码7777| 亚洲AV综合色区无码一区偷拍 | 日韩产品和欧美产品的区别| 欧美熟妇内射深插| 女人18毛片A级毛片嫰阝| 泷泽萝拉AV种子| 久久精品国产亚洲AV成人| 极品妇女扒开粉嫩小泬| 国产偷窥熟女精品视频大全| 国产成人亚洲精品无码青| 丁香婷婷激情俺也去俺来也| 宝宝好大我都握不住了视频| CHINESE国产XXXX实拍| 51无码人妻精品1国产| 制服中字人妻中字出轨中字| 亚洲最新无码中文字幕久久| 亚洲日韩精品无码AV一区二区三| 亚洲成AV人在线观看网站 | 日韩无人区码卡二卡3卡一| 秋霞国产成人精品午夜视频APP| 女性高爱潮AAAA级视频免费| 免费日韩无人区码卡二卡3卡| 看成年女人午夜毛片免费| 久久久久久精品免费无码无| 久久精品囯产精品亚洲| 精品无人区麻豆乱码1区2区新区 | 国产7色在线 | 国产| 成人免费无码大片A毛片抽搐| 啊哈~给我~啊(H)| 香蕉久久久久久AV成人| 午夜自慰喷水女成人AV| 午夜伦情电午夜伦情电影| 无码少妇一区二区浪潮AV| 无码人妻丰满熟妇惹区| 无码国产精品一区二区免费虚拟V 无码国产精品一区二区免费式直播 | 高清国产亚洲精品自在久久| 丰满的继牳3中文字幕系列免费| 初尝禁果稚嫩宫交H| 二三四五六七无产乱码| 粉嫩小泬无遮挡久久久久久| 高黄暴H日本在线观看| 父母儿女一家换着玩的文案| 国产99久久九九精品无码| 国产成人AV一区二区三区| 国产精品久久久久久精品三级| 国产精品久久无码一区| 国产乱子伦农村叉叉叉| 国产又爽又黄又舒服又刺激视频| 国内精品乱码卡一卡2卡三卡| 黑人巨大无码中文字幕无码| 精品国产黑色丝袜高跟鞋| 精品综合无码奶水一区二区| 久久久久久精品成人网站蜜臀| 久久五月丁香中文字幕| 美女大BXXXXN内射| 女人两腿扒开图片大全| 欧美最猛黑人XXXⅩ猛男欧视频| 人妻少妇精品视频无码综合 | 在公车被灌满JING液| 中文字幕乱近親相姦| CHINESE熟女老女人HD视| 宝贝把腿抬高点我让你更爽漫画| 成人免费高清A级毛片| 国产69精品久久久久9999不| 国产精品久久久天天影视 | 成人一区二区不卡久久久| 高清国语自产拍免费视频| 国产精品久久久久9999吃药| 国产一区二三区好的精华液| 激情久久AV一区AV二区AV三| 久久国产精品免费一区| 老熟妇XXXⅩHD老熟女| 欧美成人性生免费看的| 人人添人人妻人人爽夜欢视AV| 色综合久久久久综合体桃花网| 玩弄JAPAN白嫩少妇HD小说| 亚洲.国产.欧美一区二区三区| 亚洲国产美女精品久久久| 野花影视免费观看高清| 696969C大但人文艺术作品| 薄白丝小仙女自慰喷水| 国产边做饭边被躁在线播放91| 国产色母和进口色母区别| 精品无码老熟妇MAGNET| 美丽人妻被按摩中出中文字幕| 欧美人与动牲猛交XXXXBBB| 日韩精品无码区免费专区| 乌克兰少妇XXXX做受| 亚洲国产成在人网站天堂| 又嫩又紧欧美12P| ZOZOTOWN| 国产激情久久久久影院小草| 极限少妇人妻无石久久电影网 |