亚洲国产日韩成人综合天堂_一区二区三区视频网站_国内小视频在线看_国产精品热视频_国产丝袜自拍_国产视频久久久久_麻豆精品免费视频入口_久久综合国产精品

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

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

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

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

推薦答案

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

·   for

·   for in

·   for each

·   for of

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

4個(gè)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]);}

當(dāng)循環(huán)中數(shù)組的長度沒有變化時(shí),我們應(yīng)該將數(shù)組的長度存儲(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來遍歷數(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

但這樣做往往會(huì)產(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中的一個(gè)對象,Array的索引是屬性名。事實(shí)上,Javascript 中的數(shù)組有點(diǎn)誤導(dǎo)。

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

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

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

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

但是為什么遍歷Array對象的時(shí)候不輸出length屬性呢?那是因?yàn)?/font>for-in只能遍歷可枚舉屬性length是不可枚舉屬性,實(shí)際上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”屬性,因?yàn)?for-in 遍歷對象的所有屬性,而不僅僅是索引

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

因?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中的元素,它更適合遍歷對象的屬性,這也是它創(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ù)量屬性的對象,否則您應(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]]);}

在上面的代碼中,對象的屬性存儲(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 方法對數(shù)組中包含有效值的每一項(xiàng)執(zhí)行一次回調(diào)函數(shù),那些已經(jīng)被刪除(使用delete 方法等)或從未賦值的項(xiàng)將被跳過(不包括那些未定義的項(xiàng)) 或空值)。回調(diào)函數(shù)會(huì)依次傳入三個(gè)參數(shù):

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

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

如果現(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。在不同瀏覽器下測試的結(jié)果是forEach沒有for快。如果將測試代碼放在控制臺(tái)中,可能會(huì)得到不同的結(jié)果。主要原因是控制臺(tái)的執(zhí)行環(huán)境與真實(shí)的代碼執(zhí)行環(huán)境不同。

4、for-of

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

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

 console.log(data);}

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

abc

為什么要引入for-of

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

forEach 不能中斷和返回;

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

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

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

那么 for-of 能做什么呢?

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

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

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

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

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

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

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

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

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

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

最后,但并非最不重要的是,ES6 引入了另一種方法來迭代數(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 }

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

最新問答資訊

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

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

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

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

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

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

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

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

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

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

相關(guān)問題

測一測
你知道多少IT梗

一区二区三区视频免费看| 亚洲国产精品久久久久秋霞蜜臀| 三级成人在线| 激情五月婷婷综合网| 9lporm自拍视频区在线| 国产精品久久久精品a级小说| 国产波霸爆乳一区二区| 国内外成人免费在线视频| 欧美极品日韩| 浅井舞香一区二区| 国产偷亚洲偷欧美偷精品| 一区二区在线观看视频| 捆绑调教美女网站视频一区| av亚洲免费| 91国拍精品国产粉嫩亚洲一区 | 三级影片在线观看欧美日韩一区二区 | 欧美老头gaygay1069| 激情视频在线播放| 爱情岛论坛亚洲自拍| 69精品丰满人妻无码视频a片| 高清视频在线观看一区| 午夜美女久久久久爽久久| 亚洲国产成人在线视频| 欧美日韩精品国产| 中文字幕精品—区二区四季| 六月婷婷色综合| 一区二区视频欧美| 欧美日韩国产传媒| 欧美欧美在线| 欧美特黄aaaaaaaa大片| 色www永久免费视频首页在线 | xxx欧美精品| 亚洲福利视频在线| 色综合天天综合网天天看片| 亚洲三级免费观看| 久久综合一区二区| 成人午夜av在线| 激情文学综合插| 日日夜夜精品免费视频| 国产欧美69| 伊人久久亚洲影院| 欧美久久影院| 亚洲欧美综合久久久| 精品一区av| 欧洲乱码伦视频免费| 欧美人与拘性视交免费看| 国产一级成人av| 一区二区网站| av一级亚洲| 欧美偷窥清纯综合图区| 国产精品色在线网站| 国产精品毛片久久久| 麻豆一区二区麻豆免费观看| 日韩黄色av| 久久人人爽人人爽人人片av不| 一区二区网站| 中文字幕av一区二区三区人| 亲子伦视频一区二区三区| 牛牛视频精品一区二区不卡| xxxx日韩| 日韩欧美国产大片| 少妇一区二区视频| 欧美日韩在线网站| 日韩电影一区| 一本精品一区二区三区| 欧美黄色一区二区| 欧美三区视频| 亚洲在线播放| 精品综合免费视频观看| 国产黄色精品网站| 91蜜桃婷婷狠狠久久综合9色| 久久精品夜色噜噜亚洲a∨| 国产欧美日韩在线| 伊人色综合久久天天人手人婷| 亚洲aⅴ怡春院| 欧美在线观看视频一区二区 | 国产偷窥女洗浴在线观看亚洲| 色视频在线免费| 超碰成人福利网| 在线观看免费网站| 欧美成人二区| 国产网站在线| 亚洲欧洲二区| 欧美一区二区三区激情视频| 欧美激情在线| 麻豆精品视频在线观看视频| 成人免费黄色在线| 综合分类小说区另类春色亚洲小说欧美 | 久久午夜福利电影| 激情五月婷婷在线| 中文字幕制服诱惑| 在线亚洲色图| 日本黄色女人| 中文在线一二区| free性护士videos欧美| 日本99精品| 国产精品久久久乱弄| 丝袜美腿一区二区三区| 激情成人综合网| 欧美国产一区二区| 欧美日本乱大交xxxxx| 亚洲欧美制服丝袜| 91高清视频免费观看| 激情欧美一区二区三区中文字幕| 精品国产一区二区三区在线| 欧美日韩一区二区三区69堂| 国产3级在线观看| 国产精品久久久久久免费播放| 国内精品久久久久久影院老狼| 91网页版在线登录入口| 僵尸再翻生在线观看免费国语| 红杏视频成人| 日韩专区在线视频| 亚洲天堂久久久久久久| 日韩精品中文字幕在线一区| 国产一区不卡精品| 亚洲人成在线播放网站岛国| 欧美成人三级电影在线| 国产+人+亚洲| 亚洲mv在线看| 欧美一级大片免费看| 国产小视频在线免费观看| 手机在线理论电影| 欧美69xxxxx| 精品成人18| 免费看精品久久片| 亚洲成av人综合在线观看| 亚洲少妇激情视频| 国产 高清 精品 在线 a | 俺要去色综合狠狠| 成人av第一页| 欧美久久一二三四区| 国产成人免费av| 你真棒插曲来救救我在线观看| 免费看黄色av| 亚洲在线偷拍自拍| 三级国产在线观看| 成人在线视频中文字幕| 裸体在线国模精品偷拍| 91福利在线导航| 国产精品成人国产乱一区| 国模无码视频一区二区三区| 麻豆chinese极品少妇| 国产精品偷乱一区二区三区| 精品视频在线一区二区| 久久亚洲成人| 国产精品嫩草影院av蜜臀| 这里精品视频免费| 亚洲一区二三| 成人午夜免费影院| 国产中文伊人| 秋霞伦理一区| 欧美亚洲三区| 欧美性生交片4| 成人日韩在线电影| 肉丝美足丝袜一区二区三区四| 黄色av免费观看| 久久综合之合合综合久久| 久久久久电影| 精品久久久久久久久久| 国产成人精品在线观看| 国产成人美女视频| 亚洲xxx在线| 黄色网页在线免费看| 精品91在线| 欧美日韩一区二区三区四区| 国产一区二区在线观看免费播放| 亚洲综合自拍网| 国产美女被草| 成人精品动漫| 成人教育av在线| 久久精品91久久香蕉加勒比| 欧美 日韩 国产 高清| 国产欧美一级片| 最新国产在线拍揄自揄视频| 日韩女同一区二区三区| 在线视频 日韩| 青青青伊人色综合久久| 朝桐光av在线| 一区二区三区影院| 欧美色欧美亚洲另类二区精品| 日韩av成人在线| 日韩亚洲一区在线播放| 午夜爱爱毛片xxxx视频免费看| 菠萝蜜视频网址| 中文字幕一区二区三区中文字幕 | 韩国中文字幕av| 天天干视频在线| 婷婷综合六月| 久久亚洲精精品中文字幕早川悠里| 蜜月aⅴ免费一区二区三区| 五月激情五月婷婷| 国产中文第一页| 欧美日韩一本| 欧美亚日韩国产aⅴ精品中极品| 日本中文不卡| 在线免费a视频| 鲁鲁在线中文| 国产精品二三区| 国产精品三区www17con|