目錄
語法" >語法
Arrays" >Arrays
Map
" >Map
Set" >Set
String" >String
Arguments Object" >Arguments Object
Generators" >Generators
普通物件不可迭代" >普通物件不可迭代
for...of vs. for...in" >for...of vs. for...in
总结" >总结
首頁 web前端 js教程 深入了解JS中的for...of循環

深入了解JS中的for...of循環

Oct 12, 2020 pm 05:42 PM
javascript

本篇文章帶大家深入了解JavaScript中的for...of迴圈。有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

深入了解JS中的for...of循環

for...of語句所建立的迴圈可以遍歷物件。在ES6中引入的for...of可以取代另外兩種迴圈語句for...in和forEach(),而且這個新的迴圈語句支援新的迭代協定。 for...of允許你遍歷可迭代的資料結構,例如陣列、字串、映射、集合等。

語法

for (variable of iterable) {
    statement
}
登入後複製
  • variable:每個迭代的屬性值被指派給variable

  • iterable:一個具有可枚舉屬性並且可以迭代的物件

我們使用一些範例來闡述。

Arrays

array是簡單的列表,看起來像是object。數組原型有多種方法,允許在其上執行操作,例如遍歷。下面的範例使用for...of來對一個array進行遍歷操作:

const iterable = ['mini', 'mani', 'mo'];

for (const value of iterable) {
    console.log(value);
}

// Output:
// => mini
// => mani
// => mo
登入後複製

其結果就是印出iterable陣列中的每一個值。

Map

Map物件持有key-value對。物件和原始值可以當作一個keyvalueMap物件根據插入的方式遍歷元素。換句話說,for...of在每次迭代中傳回一個kay-value對的陣列。

const iterable = new Map([['one', 1], ['two', 2]]);

for (const [key, value] of iterable) {
    console.log(`Key: ${key} and Value: ${value}`);
}

// Output:
// => Key: one and Value: 1
// => Key: two and Value: 2
登入後複製

Set

Set物件允許你儲存任何類型的唯一值,這些值可以是原始值或物件。 Set物件只是值的集合。 Set元素的迭代是基於插入順序,每個值只能發生一次。如果你創建一個具有相同元素不只一次的Set,那麼它仍然被認為是單一元素。

const iterable = new Set([1, 1, 2, 2, 1]);

for (const value of iterable) {
    console.log(value);
}

// Output:
// => 1
// => 2
登入後複製

儘管我們創建的Set有多個12,但遍歷輸出的只有12

String

字串用於以文字形式儲存資料。

const iterable = 'javascript';

for (const value of iterable) {
    console.log(value);
}

// Output:
// => "j"
// => "a"
// => "v"
// => "a"
// => "s"
// => "c"
// => "r"
// => "i"
// => "p"
// => "t"
登入後複製

在這裡,對字串執行迭代,並列印出每個索引上(index)的字元。

Arguments Object

把一個參數物件看成是一個類似陣列的對象,與傳遞給函數的參數相對應。這是一個用例:

function args() {
    for (const arg of arguments) {
        console.log(arg);
    }
}

args('a', 'b', 'c');

// Output:
// => a
// => b
// => c
登入後複製

你可能在想,到底發生了什麼事?正如我前面所說的,當呼叫函數時,參數會接收傳入args()函數的任何參數。因此,如果我們將20個參數傳遞給args()函數,我們將輸出20個參數。

在上面的範例基礎上做一些調整,例如給args()函數,傳入一個物件、陣列和函數:

function fn(){
return 'functions';
}

args('a', 'w3cplus', 'c',{'name': 'airen'},['a',1,3],fn());

// Output:
// => "a"
// => "w3cplus"
// => "c"
// => Object {
// =>     "name": "airen"
// => }
// => Array [
// =>    "a",
// =>    1,
// =>    3
// => ]
// => "functions"
登入後複製

Generators

產生器是一個函數,它可以退出函數,稍後重新進入函數。

function* generator(){ 
    yield 1; 
    yield 2; 
    yield 3; 
};

for (const g of generator()) { 
    console.log(g); 
}

// Output:
// => 1
// => 2
// => 3
登入後複製

function* 定義一個生成器函數,該函數傳回生成器物件。更多關於生成器相關的信息,可以點擊這裡

關閉迭代器

JavaScript中提供了四個已知的終止循環的方法:breakcontinuereturnthrow。來看一個範例:

const iterable = ['mini', 'mani', 'mo'];

for (const value of iterable) {
console.log(value);
break;
}

// Output:
// => mini
登入後複製

在這個例子中,我們使用break關鍵字來終止一個循環,並且只印出一個mini

普通物件不可迭代

for...of迴圈只能和迭代一起工作。但普通物件是不可迭代的。讓我們看看:

const obj = { fname: 'foo', lname: 'bar' };

for (const value of obj) { // TypeError: obj[Symbol.iterator] is not a function
    console.log(value);
}
登入後複製

在這裡,我們定義了一個普通物件obj,當我們嘗試for...ofobj進行操作時,會報錯:TypeError: obj[Symbol.iterator] is not a function

我們可以把一個類似陣列的物件轉找成一個陣列。物件將具有length屬性,它的元素可以被索引。來看一個範例:

const obj = { length: 3, 0: 'foo', 1: 'bar', 2: 'baz' };
const array = Array.from(obj);
for (const value of array) { 
    console.log(value);
}
// Output:
// => foo
// => bar
// => baz
登入後複製

Array.from()方法從類似陣列(Array-lik)或迭代物件中建立了一個新的陣列實例。

<span style="font-size: 20px;">for...of</span> vs. for...in

##for...in在迴圈中將遍歷物件中所有可枚舉屬性。

Array.prototype.newArr = () => {};
Array.prototype.anotherNewArr = () => {};
const array = [&#39;foo&#39;, &#39;bar&#39;, &#39;baz&#39;];
for (const value in array) { 
    console.log(value);
}
// Outcome:
// => 0
// => 1
// => 2
// => newArr
// => anotherNewArr
登入後複製

for...in不僅可以列舉數組裡宣告的值,它還可以從建構子的原型中尋找繼承的非枚舉屬性,例如上例中的newArranotherNewArr,並將它們印出來。

for...of可以对数组和对象等做更具体的操作,但并不表示包括所有对象。

注意:任何具有Symbol.iterator属性的元素都是可迭代的。

Array.prototype.newArr = function() {};
const array = [&#39;foo&#39;, &#39;bar&#39;, &#39;baz&#39;];
for (const value of array) { 
    console.log(value);
}
// Outcome:
// => foo
// => bar
// => baz
登入後複製

for...of不考虑构造函数原型的不可枚举属性。它只需要查找可枚举属性并将其打印出来。

总结

理解for...of循环在开发过程中的用法,可以节省很多时间。希望本文能帮助您理解和编写JavaScript开发中的更好的循环结构。从而让你编码更快乐!

相关免费学习推荐:js视频教程

以上是深入了解JS中的for...of循環的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

簡易JavaScript教學:取得HTTP狀態碼的方法

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript與WebSocket:打造高效率的即時天氣預報系統

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

如何在JavaScript中取得HTTP狀態碼的簡單方法

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

javascript如何使用insertBefore

See all articles