亚洲 国产精品 日韩-亚洲 激情-亚洲 欧美 91-亚洲 欧美 成人日韩-青青青草视频在线观看-青青青草影院

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

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > for循環知識點總結

for循環知識點總結

來源:千鋒教育
發布人:wjy
時間: 2022-06-02 13:49:00 1654148940

幾種遍歷方法中for執行最快,它沒有任何額外的函數調用棧和上下文。但在實際開發中我們要結合語義話、可讀性和程序性能,去選擇究竟使用哪種方案。下面來看for , foreach , map ,for...in , for...of五種方法現場battle。

for循環

 

**自我介紹**

**for**

我是最早出現的一方遍歷語句,在座的各位需稱我一聲爺爺。我能滿足開發人員的絕大多數的需求。

```text
// 遍歷數組
let arr = [1,2,3];
for(let i = 0;i < arr.length;i++){
    console.log(i) // 索引,數組下標
    console.log(arr[i]) // 數組下標所對應的元素
}

// 遍歷對象
let profile = {name:"April",nickname:"二十七刻",country:"China"};
for(let i = 0, keys=Object.keys(profile); i < keys.length;i++){
    console.log(keys[i]) // 對象的鍵值
    console.log(profile[keys[i]]) // 對象的鍵對應的值
}

// 遍歷字符串
let str = "abcdef";
for(let i = 0;i < str.length ;i++){
    console.log(i) // 索引 字符串的下標
    console.log(str[i]) // 字符串下標所對應的元素
}

// 遍歷DOM 節點
let articleParagraphs = document.querySelectorAll('.article > p');
for(let i = 0;i<articleParagraphs.length;i++){
    articleParagraphs[i].classList.add("paragraph");
    // 給class名為“article”節點下的 p 標簽添加一個名為“paragraph” class屬性
}
```

**forEach**

我是ES5版本發布的。按升序為數組中含有效值的每一項執行一次 callback 函數,那些已刪除或者未初始化的項將被跳過(例如在稀疏數組上)。我是 for 循環的加強版。

```text
// 遍歷數組
let arr = [1,2,3];
arr.forEach(i => console.log(i))

// logs 1
// logs 2
// logs 3
// 直接輸出了數組的元素

//遍歷對象
let profile = {name:"April",nickname:"二十七刻",country:"China"};
let keys = Object.keys(profile);
keys.forEach(i => {
    console.log(i) // 對象的鍵值
    console.log(profile[i]) // 對象的鍵對應的值
})
```

**map**

我也是ES5版本發布的,我可以創建一個新數組,新數組的結果是原數組中的每個元素都調用一次提供的函數后的返回值。

```text
let arr = [1,2,3,4,5];
let res = arr.map(i => i * i);

console.log(res) // logs [1, 4, 9, 16, 25]
```

**for...in枚舉**

我是ES5版本發布的。以任意順序遍歷一個對象的除Symbol以外的可枚舉屬性。

```text
// 遍歷對象
let profile = {name:"April",nickname:"二十七刻",country:"China"};
for(let i in profile){
    let item = profile[i];
    console.log(item) // 對象的鍵值
    console.log(i) // 對象的鍵對應的值

// 遍歷數組
let arr = ['a','b','c'];
for(let i in arr){
    let item = arr[i];
    console.log(item) // 數組下標所對應的元素
    console.log(i) // 索引,數組下標

// 遍歷字符串
let str = "abcd"
for(let i in str){
    let item = str[i];
    console.log(item) // 字符串下標所對應的元素
    console.log(i) // 索引 字符串的下標
}
```

**for...of迭代**

我是ES6版本發布的。在可迭代對象(包括 Array,Map,Set,String,TypedArray,arguments 對象等等)上創建一個迭代循環,調用自定義迭代鉤子,并為每個不同屬性的值執行語句。

```text
// 迭代數組數組
let arr = ['a','b','c'];
for(let item of arr){
    console.log(item)
}
// logs 'a'
// logs 'b'
// logs 'c'

// 迭代字符串
let str = "abc";
for (let value of str) {
    console.log(value);
}
// logs 'a'
// logs 'b'
// logs 'c'

// 迭代map
let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]
for (let entry of iterable) {
    console.log(entry);
}
// logs ["a", 1]
// logs ["b", 2]
// logs ["c", 3]

// 迭代map獲取鍵值
for (let [key, value] of iterable) {
    console.log(key)
    console.log(value);
}


// 迭代set
let iterable = new Set([1, 1, 2, 2, 3, 3,4]);
for (let value of iterable) {
    console.log(value);
}
// logs 1
// logs 2
// logs 3
// logs 4

// 迭代 DOM 節點
let articleParagraphs = document.querySelectorAll('.article > p');
for (let paragraph of articleParagraphs) {
    paragraph.classList.add("paragraph");
    // 給class名為“article”節點下的 p 標簽添加一個名為“paragraph” class屬性。
}

// 迭代arguments類數組對象
(function() {
  for (let argument of arguments) {
    console.log(argument);
  }
})(1, 2, 3);
// logs:
// 1
// 2
// 3


// 迭代類型數組
let typeArr = new Uint8Array([0x00, 0xff]);
for (let value of typeArr) {
  console.log(value);
}
// logs:
// 0
// 255
```

經過第一輪的自我介紹和技能展示后,我們了解到:

- for語句是最原始的循環語句。定義一個變量i(數字類型,表示數組的下標),按照一定的條件,對i進行循環累加。條件通常為循環對象的長度,當超過長度就停止循環。因為對象無法判斷長度,所以搭配Object.keys()使用。
- forEach ES5 提出。自稱是for語句的加強版,可以發現它比for語句在寫法上簡單了很多。但是本質上也是數組的循環。forEach每個數組元素執行一次 callback 函數。也就是調用它的數組,因此,不會改變原數組。返回值是undefine。
- map ES5 提出。給原數組中的每個元素都按順序調用一次 callback 函數。生成一個新數組,不修改調用它的原數組本身。返回值是新的數組。
- for...in ES5 提出。遍歷對象上的可枚舉屬性,包括原型對象上的屬性,且按任意順序進行遍歷,也就是順序不固定。遍歷數組時把數組的下標當作鍵值,此時的i是個字符串型的。它是為遍歷對象屬性而構建的,不建議與數組一起使用。
- for...of ES6 提出。只遍歷可迭代對象的數據。

**能力甄別**

作為一個程序員,僅僅認識他們是遠遠不夠的,在實際開發中鑒別他們各自的優缺點。因地制宜的使用他們,揚長避短。從而提高程序的整體性能才是能力之所在。

關于跳出循環體

在循環中滿足一定條件就跳出循環體,或者跳過不符合條件的數據繼續循環其它數據。是經常會遇到的需求。常用的語句是break 與 continue。

簡單的說一下二者的區別,就當復習好了。

- break語句是跳出當前循環,并執行當前循環之后的語句;
- continue語句是終止當前循環,并繼續執行下一次循環;

注意:forEach 與map 是不支持跳出循環體的,其它三種方法均支持。

原理 :查看forEach實現原理,就會理解這個問題。

```text
Array.prototype.forEach(callbackfn [,thisArg]{
   
}
```

傳入的function是這里的回調函數。在回調函數里面使用break肯定是非法的,因為break只能用于跳出循環,回調函數不是循環體。

在回調函數中使用return,只是將結果返回到上級函數,也就是這個for循環中,并沒有結束for循環,所以return也是無效的。

map() 同理。

map()鏈式調用

map() 方法是可以鏈式調用的,這意味著它可以方便的結合其它方法一起使用。例如:reduce(), sort(), filter() 等。但是其它方法并不能做到這一點。forEach()的返回值是undefined,所以無法鏈式調用。

```text
// 將元素乘以本身,再進行求和。
let arr = [1, 2, 3, 4, 5];
let res1 = arr.map(item => item * item).reduce((total, value) => total + value);

console.log(res1) // logs 55 undefined"
```

for...in會遍歷出原型對象上的屬性

```text
Object.prototype.objCustom = function() {};
Array.prototype.arrCustom = function() {};
var arr = ['a', 'b', 'c'];
arr.foo = 'hello
for (var i in arr) {
    console.log(i);
}
// logs
// 0
// 1
// 2
// foo
// arrCustom
// objCustom
```

然而在實際的開發中,我們并不需要原型對象上的屬性。這種情況下我們可以使用hasOwnProperty() 方法,它會返回一個布爾值,指示對象自身屬性中是否具有指定的屬性(也就是,是否有指定的鍵)。如下:

```text
Object.prototype.objCustom = function() {};
Array.prototype.arrCustom = function() {};
var arr = ['a', 'b', 'c'];
arr.foo = 'hello
for (var i in arr) {
    if (arr.hasOwnProperty(i)) {
        console.log(i);
    }
}
// logs
// 0
// 1
// 2
// foo

// 可見數組本身的屬性還是無法擺脫。此時建議使用 forEach
```

對于純對象的遍歷,選擇for..in枚舉更方便;對于數組遍歷,如果不需要知道索引for..of迭代更合適,因為還可以中斷;如果需要知道索引,則forEach()更合適;對于其他字符串,類數組,類型數組的迭代,for..of更占上風更勝一籌。但是注意低版本瀏覽器的是配性。

**性能**

有興趣的讀者可以找一組數據自行測試,文章就直接給出結果了,并做相應的解釋。

```text
for > for-of > forEach > map > for-in
```

- for 循環當然是最簡單的,因為它沒有任何額外的函數調用棧和上下文;
- for...of只要具有Iterator接口的數據結構,都可以使用它迭代成員。它直接讀取的是鍵值。
- forEach,因為它其實比我們想象得要復雜一些,它實際上是array.forEach(function(currentValue, index, arr), thisValue)它不是普通的 for 循環的語法糖,還有諸多參數和上下文需要在執行的時候考慮進來,這里可能拖慢性能;
- map() 最慢,因為它的返回值是一個等長的全新的數組,數組創建和賦值產生的性能開銷很大。
- for...in需要窮舉對象的所有屬性,包括自定義的添加的屬性也能遍歷到。且for...in的key是String類型,有轉換過程,開銷比較大。

**總結**

在實際開發中我們要結合語義話、可讀性和程序性能,去選擇究竟使用哪種方案。

如果你需要將數組按照某種規則映射為另一個數組,就應該用 map。

如果你需要進行簡單的遍歷,用 forEach 或者 for of。

如果你需要對迭代器進行遍歷,用 for of。

如果你需要過濾出符合條件的項,用 filterr。

如果你需要先按照規則映射為新數組,再根據條件過濾,那就用一個 map 加一個 filter。

總之,因地制宜,因時而變。千萬不要因為過分追求性能,而忽略了語義和可讀性。在您的統治之下,他們5個只能是各自發揮長處,誰都別想稱霸。

**- End -**

更多關于“web前端培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒已有十余年的培訓經驗,課程大綱更科學更專業,有針對零基礎的就業班,有針對想提升技術的提升班,高品質課程助理你實現夢想。

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
国产精品免费AV片在线观看| 色欲蜜臀av无码久久浪潮一区| 亚洲美女国产精品久久久久久久久| 水蜜桃国产精品欧美日韩一区不卡| 欧美一区二区三区放荡人妇| 麻花传媒0076在线观看| 久久国产成人精品国产成人亚洲| 国产桃色无码视频在线观看| 国产成人精品无码一区二区三区| 产精品无码久久_亚洲国产精| GAY片男同网站WWW| 99久久婷婷国产综合亚洲| 中文在线А√在线| 永久免费看真人动漫网站| 亚洲欧美黑人深喉猛交群| 中文字幕AV无码专区第一页 | 亚洲一线产区二线产区区别| JAPANESE成熟丰满熟妇| 亚洲成AV人在线观看网站 | 性夜影院爽黄A爽免费动漫| 天堂资源官网在线资源| 天码AV无码一区二区三区四区| 少妇特黄Av一区二区三区| 日产乱码一二三区别免费| 人妻少妇看A偷人无码| 人妻在夫面前被性爆| 日本午夜精品一区二区三区电影| 日日噜噜夜夜狠狠久久无码区| 色爱无码AV综合区老司机非洲| 日韩精品一区二区三区在线观看L| 日本WINDOWS免费吗| 日韩人妻无码免费视频一区二区三| 亚洲AV成人精品五区| 亚洲精品无码成人片在线观看| 亚洲精品无码AV中文字幕电影网| ASS年轻少妇BBWPICS| 被伴郎的内捧猛烈进出H| 成人欧美一区二区三区| 高清国语自产拍免费视频| 国产精品妇女一二三区| 国产亚洲日韩AV在线播放不卡| 韩国免费A级毛片| 久久久亚洲熟妇熟女ⅩXXXHD| 狂野欧美性猛交XXXX| 欧美黑人一级二级巨大久久天堂| 人妻丰满熟妇av无码区乱| 亚洲AV无码一区二区三区波多野 | 被黑人伦流澡到高潮HNP动漫| 交换朋友夫妻客厅互换4韩国| 久久国语露脸国产精品电影| 蜜桃久久国产一区二区| 欧美亚洲日韩AⅤ在线观看| 亚洲AV乱码VA国产AV22| 伊人久久中文字幕| 国产成人亚洲精品另类动态| 好爽好紧好大的免费视频国产| 人妻AV中文字幕无码专区| 无码粉嫩虎白一线天在线观看| 新狼窝色AV性久久久久久| 亚洲中文字幕码在线电影| 丰满熟女一区二区三区蜜桃臀| 国色天香在线观看全集免费播放| 久久人人97超碰精品| 秋霞电影院午夜无码中文| 亚洲欧美成人AⅤ在线专区| 夫前人妻被灌醉侵犯在线| 免费A级毛片在线播放不收费| 日韩精品一二三区| 在线观看片免费人成视频无码| 成人免费A级毛片无码片在线播放 成人免费A级毛片无码片2022 | 斯诺克直播在线观看高清直播| 2018一本久道在线线观看| 大胆极品美軳人人体| 国内极度色诱视频网站| 免费人成在线观看网站品善网| 色噜噜影院狠狠狠噜| 18大禁漫画吃奶羞羞漫画| 精品推荐国产AV剧情| 亲孑伦视频一区二区三区| 无遮挡粉嫩小泬久久久久久久动漫| 亚洲色国产欧美日韩| BBwBBw高潮喷水日本少妇自| 国产精品毛片无码一区二区蜜桃| 久久夜色精品国产噜噜AV| 日韩精品无码人成视频| 中文字幕在线观看亚洲日韩| 国产成人久久久精品二区三区 | 免费下载破解看片APP的软件| 亚洲精品中文字幕久久久久下载| 国产精品毛片在线完整版SAB| 日韩一区二区三区射精| TPU色母和PA6色母的作用| 国产欧美久久久久久精品一区二区| 每晚都被他添的流好多水| 亚洲精品无码久久千人斩 | 亚洲中文字幕日产无码| 国语自产偷拍精品视频| 午夜男女爽爽影院免费视频下载| 在线天堂中文最新版WWW下载| 高潮潮喷奶水飞溅视频无码| 琪琪网三级伦锂电影| 在线观看特色大片免费网站| 久久精品国产久精国产果冻传媒| 亚洲丰满熟妇乱XXXXX网站 | 丰满人妻熟妇乱又伦精品APP| 欧美一区二期三区视频| 77777亚洲午夜久久多喷| 国产午夜精品一区二区三区漫画| 女主播屁G裸露W身曝光| 亚欧成人无码AV在线播放| 国产成人久久综合第一区| 少妇呻吟翘臀后进爆白浆| 丰满少妇BBWBBW| 少妇极品熟妇人妻200片| 最新的美国ZOOM动物| 老师上课跳D突然被开到最大视频| 无码AV中文字幕久久专区| 国99久9在线 | 免费| 男朋友一晚弄了我5次正常吗 | 2012电影在线观看神马影院| 美女裸体十八禁免费网站| 中文字幕精品亚洲无线码一区应用| 国产欧美久久一区二区| 私人电影院免费看吗| 国产成人人人97超碰超爽8| 天天狠天天透天天爱综合| 国产精品无码不卡一区二区三区| 无套内射无矿码免费看黄| 国产在视频线精品视频| 亚洲国产成人精品福利在线观看 | 乳头羞涩NP公主| 国产SUV精品一区二区69| 欧美激情000ⅩXX同性| Chinese老女人老熟妇HD| 人妻系列无码专区免费视频| 成人无码精品1区2区3区免费看| 色窝窝亚洲AV网在线观看| 国产精品国产三级国AV| 小SAO货边洗澡边CAO你| 极品少妇被猛的白浆直喷白浆 | 被邻居侵犯性HD中文字幕| 日文文本乱码高清| 国产精品民宅偷窥盗摄| 亚洲AV午夜成人片精品网站| 久久精品国产成人| 中文字幕无码肉感爆乳在线| 奇米第四色777ME| 高清偷自拍亚洲精品三区| 午夜亚洲国产理论片中文飘花| 机密重案之致命诱惑| 无码中文人妻在线三区| 大炕上的肉体交换| 偷窥@MADSEXTUBE| 第一次处破女01免费观看| 我的好妈妈中文字幕| 成人爽A毛片免费网站| 无码18在线网站成人网站| 孩交精品XXXX视频视频| 永久免费AⅤ无码网站在线观看| 女人另类牲交ZOZOZO| 成人性欧美丨区二区三区| 午夜福利1000 92免费| 久久99热这里只有精品国产| 60老妇VIDEOXXX| 麻批好紧日起要舒服死了| おやすみせくよ晚安免费影院| 哦┅┅快┅┅用力啊┅┅| 成人国产一区二区三区精品不卡 | 日本在线人数最多的MMORPG| 国产精品亚洲色婷婷99久久精品 | 亚洲午夜久久久久久噜噜噜| 欧美日韩在线亚洲一区蜜芽| 6080YYY午夜理伦三级| 日韩精品人妻中文字幕有码| 国内精品久久久久久99蜜桃| 中文JAPANESE在线播放| 肉欲麻豆天美传媒| 精品少妇无码AV在线播放| AV无码中文字幕不卡一区二区三 | 99久久99久久久精品齐齐综合| 试看A级看一毛片二十分钟| 皇上御花园HLH| JAPANESE精品中国少妇| 无人区码一码二码高高| 久欠精品国国产99国产精2| 成人午夜又粗又硬又长| 亚洲精品美女久久久久99| 欧美午夜精品久久久久久浪潮| 国产精品无码素人福利免费| 在线中文天堂最新版WWW| 色综合久久婷婷88| 久久久久亚洲AV成人片丁香| 成人精品免费视频在线观看| 亚洲欧美精品一中文字幕| 久久久精品国产SM最大网站| 野花免费观看日本电影哔哩哔哩| 久久精品伊人一区二区三区| 成人无码视频97免费| 野花高清中文免费观看视频| 少妇人妻偷人精品无码视频新浪 |