成人区精品一区二区婷婷,91caoporn在线,a√在线中文网新版址在线,蜜臀久久99精品久久久无需会员

千鋒教育-做有情懷、有良心、有品質(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)看看最常見的寫法:

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)的寫法:

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] 之類的寫法,是因?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)生更多的開銷,所以它比其他循環(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)的開銷和時(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)編寫的 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梗

成人区精品一区二区婷婷,91caoporn在线,a√在线中文网新版址在线,蜜臀久久99精品久久久无需会员
精品网站999| 美女久久网站| 无码日韩精品一区二区免费| 丝袜亚洲精品中文字幕一区| 久久国产精品毛片| 亚洲色图国产| 日韩精品国产精品| 欧美一级久久| 久久精品免视看国产成人| 精品国产18久久久久久二百| 电影亚洲精品噜噜在线观看| 久久精品亚洲欧美日韩精品中文字幕| 黄色精品视频| 97精品视频在线看| 久久久久91| 中文不卡在线| 国产福利资源一区| 91精品久久久久久久久久不卡| 在线一区免费观看| 日本成人在线视频网站| 久久一区国产| 亚洲午夜91| 亚洲精品精选| 久久精品国产在热久久| 亚洲永久av| 怡红院精品视频在线观看极品| 亚洲欧美日韩国产一区| 亚洲久久视频| 国产一区日韩| 欧美特黄a级高清免费大片a级| 亚洲精品在线a| 国产日本精品| 亚洲一级少妇| 蜜桃视频在线观看一区二区| 国产精品igao视频网网址不卡日韩 | 久久av日韩| 久久久久91| 国产亚洲一卡2卡3卡4卡新区| 麻豆视频在线看| 欧美午夜不卡影院在线观看完整版免费| 亚洲色图综合| 久久久免费人体| 亚州av乱码久久精品蜜桃| 国产探花在线精品| 亚洲国产不卡| 久久久国产精品网站| 欧美日韩国产在线观看网站| 国产欧美一区二区三区精品观看 | 亚洲播播91| 日本欧美在线| 亚洲性视频h| 国产精品乱战久久久| 亚洲少妇自拍| 精品视频99| 天使萌一区二区三区免费观看| 免费看久久久| 免费美女久久99| 日韩免费在线| 国产精品亚洲综合在线观看| 视频一区视频二区中文| 国产一区二区亚洲| 日本亚洲三级在线| 久久久久美女| 精品久久一区| 欧美精品影院| 一区二区三区午夜视频| 国模 一区 二区 三区| 精品一级视频| 青青草精品视频| 亚洲一区欧美激情| 日韩av一级| 岛国av免费在线观看| 国产精品美女午夜爽爽| 首页欧美精品中文字幕| 91精品一区二区三区综合| 久久成人福利| 日韩黄色在线观看| 一区二区亚洲视频| 欧美女激情福利| 日韩三区免费| 91一区二区三区四区| 国产精品成人一区二区网站软件| 亚洲精品一级二级三级| 一区二区三区四区精品视频| 日韩一区二区免费看| 99久久99久久精品国产片果冰 | 伊人久久国产| 久久99国产精品视频| 国产精久久一区二区| 欧美啪啪一区| 青青青国产精品| 欧美一区影院| 国产精品中文字幕制服诱惑| 日韩av午夜在线观看| 日韩和欧美一区二区三区| 日韩欧美在线精品| 日本亚洲视频| 国产免费av一区二区三区| 国产欧美自拍| 久久99久久久精品欧美| 蜜桃久久久久| 国产福利91精品一区二区| 精品视频自拍| 天堂中文av在线资源库| 欧美羞羞视频| 久久免费大视频| 不卡视频在线| 一区在线视频观看| 亚洲一区二区三区高清| 免费看日韩精品| 欧美日韩一区自拍| 麻豆久久一区| av综合电影网站| 伊人久久成人| 日韩精品一区二区三区中文| 国产探花在线精品| 激情久久99| 国产99久久久国产精品成人免费| 午夜欧美精品| 日韩精品久久理论片| 精品一区二区三区的国产在线观看| 国产一区二区三区国产精品| 成人羞羞视频播放网站| 欧美日韩国产传媒| 亚洲欧洲日韩精品在线| 国产精品一区二区三区av麻| 国产一区二区三区天码| 婷婷国产精品| 视频一区中文字幕精品| 久久久91麻豆精品国产一区| 激情偷拍久久| 日日摸夜夜添夜夜添国产精品| 日本aⅴ亚洲精品中文乱码| 免费在线观看一区| 婷婷亚洲综合| 青草av.久久免费一区| 国产在线视频欧美一区| 99国产精品久久久久久久成人热| 视频国产精品| 国产福利片在线观看| 亚洲一区二区三区高清| 乱一区二区av| 欧美日韩国产在线一区| 国产精品久久国产愉拍| 999精品色在线播放| 91麻豆精品激情在线观看最新| 在线看片国产福利你懂的| 99成人在线| 成人国产精选| 日韩精品第二页| 婷婷激情久久| 国产精品亲子伦av一区二区三区| 激情丁香综合| 国产精品115| 中文精品电影| 欧美成人精品三级网站| 日本中文字幕不卡| 精品在线91| 免费亚洲婷婷| 中文字幕日韩欧美精品高清在线| 久久uomeier| 久久国产精品免费一区二区三区 | 午夜在线播放视频欧美| 久久精品免费看| 蜜桃视频在线观看一区二区| 国产在线看片免费视频在线观看| 免费精品视频最新在线| 三级在线看中文字幕完整版| 91国内精品| 国产视频一区三区| 久久精品国产999大香线蕉| 亚洲在线一区| 国产资源在线观看入口av| 亚洲一区二区三区四区电影| 久久青草久久| 精品视频在线观看网站| 日韩av午夜在线观看| 免费日韩av| 欧美丝袜一区| av资源中文在线天堂| 国产精品嫩模av在线| 亚洲欧洲美洲国产香蕉| 国产精品女主播一区二区三区| 欧美韩日一区| 老鸭窝一区二区久久精品| 日本va欧美va精品发布| 美国欧美日韩国产在线播放| 亚洲国产专区校园欧美| 国产一区二区三区91| 国产精品一级| 欧美一区二区三区久久| 亚洲精品麻豆| 亚洲综合中文| 免费在线看一区| 国产一区成人| 亚洲激情av| 亚洲小说欧美另类婷婷| 99久久激情| 色吊丝一区二区| 日韩欧美国产精品综合嫩v|