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

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

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

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

發(fā)布:web前端基礎(chǔ)知識 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ù)組的內(nèi)容,代碼如下:

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

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

一般來說,操作的結(jié)果如下:

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

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

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

結(jié)果如下:

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

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

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

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

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

其次,Array 的索引不是指偏移量。其實Array的索引不是Number類型,而是String類型。之所以能正確使用 arr[0] 之類的寫法,是因為語言可以自動改變 Number 類型。0 轉(zhuǎn)換為 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]);}

操作的結(jié)果是:

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

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

同時,需要注意的是,這里輸出的索引值,即“0”“1”“2”不是Number類型,而是String類型,因為它們是作為屬性輸出的,不是索引,這是否意味著我們只能輸出數(shù)組的內(nèi)容,而不能向我們的 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]);}

操作的結(jié)果是:

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)的每次迭代都會產(chǎ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搜索每個屬性相比,代碼只關(guān)注給定的屬性,節(jié)省了循環(huán)的開銷和時間。

3、forEach

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

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

 console.log(data);});

操作結(jié)果:

123

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

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

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

如果現(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);});

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

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

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

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

forEach 性能

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

4、for-of

我們先來看一個例子:

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

 console.log(data);}

運行的結(jié)果是:

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 中的新功能)對象遍歷。

總結(jié)一下,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 }

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

最新問答資訊

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

學習 unity 語言
6020 人關(guān)注

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

學習 python 工作 培訓
5389 人關(guān)注

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

學習 html 語言 可以
5062 人關(guān)注

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

語言 技術(shù) 學習
4733 人關(guān)注

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

平面 設(shè)計 學習 時間
4238 人關(guān)注

相關(guān)問題

web前端自學好還是培訓好

關(guān)于“web前端自學好還是培訓好”這個問題說法眾說紛紜,有很多...

選擇Web培訓機構(gòu)的注意事項有哪些

師資力量;老師是不是又豐富的實戰(zhàn)開發(fā)經(jīng)驗,這點是非常重要的。...

Web前端主要做什么

前端開發(fā)是創(chuàng)建Web頁面或app等前端界面呈現(xiàn)給用戶的過程,通過HT...

web前端培訓分享:學Web前端的好處有哪些

web前端近幾年在IT互聯(lián)網(wǎng)行業(yè)比較火熱,很多人都開始參加web前端...

web前端培訓分享:Web前端需要學什么

Web前端需要學什么?好不好學?這是很多想要進入到web前端行業(yè)的學...

零基礎(chǔ)參加web前端培訓都學什么

零基礎(chǔ)參加web前端培訓都學什么?基礎(chǔ)階段學習HTML常用標簽與表單...

測一測
你知道多少IT梗

GOGO全球大胆高清人体131| 夜夜夜高潮夜夜爽夜夜爰爰| 忘忧草视频在线观看| 日韩中文字幕中文无码久本草 | 婷婷开心色四房播播| 色一情一乱一乱一区91Av奶水| 久久亚洲精品综合国产仙踪林| 国产交换配乱婬视频偷| 丰满少妇被粗大猛烈进人高清| 中国帅气体育生GARY网站| 亚洲中文字幕无码一区| 亚洲制服丝袜AV一区二区三区| 天天躁日日躁狠狠躁退| 少妇被三个黑人调教| 女主被强迫侵犯H文| 欧美熟妇另类久久久久久多毛| 久久久久无码精品国产AV蜜桃1| 国产乱人伦精品一区二区在线观看| 锕锕锕锕锕锕~好深啊APP| JAPANESE失禁潮喷| 成人乱子视频在线播放| 国产AV精品白浆一区二| 一边做一边喷17P| √BT天堂网WWW中文在线| 亚洲熟伦熟女新五十路熟妇| 亚洲中文字幕乱码AV波多JI| 学生妹流白浆喷水被草| 亚洲不卡AV不卡一区二区| 亚洲精品欧美综合二区| 一区二区AV在线| 999国产精品999久久久久久| 啊轻点灬大JI巴太粗太长了在线 | XXXAV久久久久久久久久久 | 久久国产精品免费一区| 久久久久人妻一区精品色欧美| 娇妻玩4P被3个男子伺候| 久久精品久久精品久久39| 蜜桃人妻一区二区三区| 人妻少妇看A偷人无码| 天码人妻一区二区三区| 亚洲AV成人片无码网站网| 无码乱人伦一区二区亚洲一| 亚洲第一狼人天堂网亚洲AV| 在线观看高H无码黄动漫| PYTHON人马大战| 国产成人无码区免费网站| 极品人妻系列人妻30P| 美国ZOOM人与ZOOM视频| 麻花豆传媒剧国产MV免费天美| 久久久久久久久精品成人| 久久AV无码精品人妻系列| 久久99国产精品久久99蜜桃| 男女无遮挡猛进猛出免费观看视频| 老狼一区忘忧草欢迎您大豆| 久久久久亚洲AV无码麻豆| 久久亚洲AV成人无码一区二区| 久久久久久精品无码人妻| 人妻无码一区二区三区免费视频 | 国语对白全程露脸粗语对话| 久久亚洲精精品中文字幕| 日本19禁啪啪无遮挡免费| 日韩精品人妻中文字幕有码| 亚洲AV旡码高清在线观看| 亚洲成AV人片无码天堂下载| 亚洲AV无码乱码精品国产| 51国产偷自视频区视频| 国产精品成人一区二区三区| 久久久久亚洲AV成人网人人网站| 老少配XXOO老少配| 少妇开裆肉丝自慰流白浆| 亚洲中文字幕无码永久在线不卡| 尤物AV无码色AV无码麻豆| 18禁免费无码无遮挡不卡网站| AV天堂永久资源网| 穿越后每天都在PIAPIA打脸| 精品无码人妻被多人侵犯AV| 老女人性饥渴XXXXⅩHD另| 色噜噜噜狠狠色一色伊人蜜桃| 为了撞上你1∨1SC| 中国人妻XXXXX免费看| 国产精品18HDXXXⅩ| 豪妇荡乳1一5白玉兰免费下载| 久久九九久精品国产88| 日韩一区二区三区精品| 亚洲综合一区国产精品| 国产白嫩护士被弄高潮| 韩国午夜理伦三级理论三级| 久久久久亚洲精品无码蜜桃| 色一情一乱一伦一区二区三区日本 | 成人无码视频97免费| 久久久久成人精品无码| 天堂√最新版在线| 亚洲AV无码专区精品无码 | 亚洲精品成人网线在线播放VA| 游泳教练在水里含我奶小说| 国产精东天美AV影业传媒| 欧美性激烈粗大精品XXX| 亚洲精品国产自在久久| 99久久国产综合精品SWAG| 国精产品一线二线三线区别| 免费播放AV网站的地址| 亚洲AV无码一区二区三区少妇| 岳打开双腿开始配合交换| 国产麻豆精品乱码一区| 人人妻人人澡人人爽人人精直播| 小荡货奶真大水真多紧视频| 北条麻妃一区二区三区AV高清| 国农村精品国产自线拍| 色欲AV综合AV无码AⅤ| 99精品又大又爽又粗少妇毛片| 国产JIZZJIZZ麻豆全部免| 欧美人交A欧美精品AV一区| 野花香社区在线视频观看播放| СЕКС日本ВИДЕ视频| 韩国三级中文字幕HD| 私密按摩高潮熟女啪啪| 一区二三区在线 | 中国| 极品粉嫩小泬无遮挡20P| 日本H纯肉无遮掩3D动漫在线观| 亚洲国产综合无码一区二区BT下| www.内射孕妇网站入口| 炕上光着腚压在女人身上| 亚洲精品自偷自拍无码| 果冻传媒剧国产剧在线看| 无码专区3D动漫精品免费| 公交车强摁做开腿呻吟| 蜜桃人妻一区二区三区| 夜夜躁狠狠躁日日躁视频| 国产精品成人AV片免费看| 人人妻人人澡人人爽人人爱看| 亚洲欭美日韩颜射在线| 国产护士在线视频XXXX免费| 免费一对一刺激互动聊天软件| 驯服小挗子2韩语中字| 国产精品爆乳奶水无码视频| 日韩午夜理论片 中文字幕| JEAⅠOUSVUE丰满少妇| 欧美成性视頻XXXⅩXXX| 亚洲日本一线产区和二线产| 精品韩国AV无码一区二区三区| 私人电影院免费看吗| 丰满熟妇大号BBWBBWBBW| 熟妇高潮精品一区二区三区| 99国产精品久久99久久久| 嫩小槡BBBB槡BBBB槡| 亚洲色成人WWW永久网站| 国产美女被遭高潮免费网站| 强奷漂亮雪白丰满少妇| www.xx欧美大鸡巴| 日本乱码卡一卡新区入口| 成人免费午夜无码视频| 日日摸夜夜添夜夜添亚洲女人 | 精品人在线二线三线区别 | 在线观看免费播放AV片| 美女裸体十八禁免费网站| 重囗味SM在线观看无码| 久久久久亚洲AV无码专区首JN| 亚洲AV无码成人精品区在线观看 | 久久精品伊人一区二区三区| 野花高清在线观看免费官网中文版| 国产亚洲精久久久久久无码| 亚洲AV永久无码精品一区二区国| 国产精口品美女乱子伦高潮| 性妇WBBBB搡BBBB嗓小说| 激情国产AV做激情国产爱| 无码人妻一区二区三区在线| 海角国精产品三区二区三区| 亚洲欧洲无卡二区视頻| 麻豆国产成人AV在线播放欲色| 亚洲欧美日韩综合在线一| 久久亚洲AV无码精品色午夜麻| 亚洲日韩国产一区二区蜜桃| 撩起老师旗袍挺进去玉足| 97人澡人人添人人爽欧美| 日本高清二区视频久二区| 97精品伊人久久大香线蕉| 日本人妻丰满熟妇久久久久久不卡 | 日产2021免费一二三四| 国产精品99久久免费| 亚洲女同成AV人片在线观看| 麻豆国产MV视频| 成人午夜福利免费体验区| 无码AV最新无码AV专区| 精品国产亚洲一区二区三区在线观| 亚洲AV无码专区在线电影成人| 中国女人黑森林毛耸耸| 日韩国产成人无码AV毛片蜜柚| 草草影院精品一区二区三区| 玩弄秘书的奶又大又软| 久久99国产乱子伦精品免费| 13岁幼儿3OOO| 欧美大波少妇在厨房被| 国产SUV精品一区二区69| 亚洲精品无码AV中文字幕电影网| 狠狠躁夜夜躁人人躁婷婷| 中文字幕无码免费久久| 日日摸夜夜添夜夜添无码国产| 东京热无码一区二区三区AV| 亚洲成A人片在线观看无码3D| 精品久久久久国产免费|