搜尋
首頁web前端前端問答es6中數組可以用for of遍歷嗎

es6中數組可以用for of遍歷嗎

Oct 21, 2022 pm 05:23 PM
javascriptes6es6數組

es6中陣列可以用for of遍歷。 「for...of」語句建立一個迴圈來迭代可迭代的對象,ES6引入「for...of」迴圈用以取代「for...in」和forEach(),並支援新的迭代協議;「for...of」語句允許開發者遍歷Arrays(陣列)、Strings(字串)、Maps(映射)、 Sets(集合)等可迭代的資料結構。

es6中數組可以用for of遍歷嗎

本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

什麼是 for…of 迴圈

for...of 語句建立一個迴圈來迭代可迭代的物件。在 ES6 中引入的 for...of 循環,以取代 for...in 和 forEach() ,並支援新的迭代協定。 for...of 允許你遍歷 Arrays(陣列), Strings(字串), Maps(映射), Sets(集合)等可迭代的資料結構等。

語法

for (variable of iterable) {
    statement
}
  • variable:每個迭代的屬性值被指派給該變數。
  • iterable:一個具有可枚舉屬性並且可以迭代的物件。

用例

我們來探討一些用例。

Arrays(數組)

Arrays(陣列)就是類別列表(list-like)物件。數組原型上有各種方法,允許對其進行操作,例如修改和遍歷等操作。下面手在一個陣列上進行的 for...of 運算:

// array-example.js
const iterable = ['mini', 'mani', 'mo'];
 
for (const value of iterable) {
  console.log(value);
}
 
// Output:
// mini
// mani
// mo

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

Demo: https://jsbin.com/dimahag/edit?js,console

Maps(映射)

Map 物件就是保存key-value(鍵值)對。物件和原始值可以用作 key(鍵)或 value(值)。 Map 物件根據其插入方式迭代元素。換句話說, for...of 迴圈將為每次迭代傳回一個 key-value(鍵值) 陣列。

// map-example.js
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

Demo: https://jsbin.com/lofewiw/edit?js,console

Set(集合)

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

// set-example.js
const iterable = new Set([1, 1, 2, 2, 1]);
 
for (const value of iterable) {
  console.log(value);
}
// Output:
// 1
// 2

#儘管我們的Set(集合) 有多個 1 和 2 ,但輸出的只有 1 和 2 。

Demo: https://jsbin.com/fajozob/edit?js,console

String(字串)

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

// string-example.js
const iterable = 'javascript';
 
for (const value of iterable) {
  console.log(value);
}
 
// Output:
// "j"
// "a"
// "v"
// "a"
// "s"
// "c"
// "r"
// "i"
// "p"
// "t"

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

Demo: https://jsbin.com/rixakeg/edit?js,console

Arguments Object(參數物件)

把一個參數物件看作是一個類數組(array-like)對象,並且對應於傳遞給函數的參數。這是一個用例:

// arguments-example.js
function args() {
  for (const arg of arguments) {
    console.log(arg);
  }
}
 
args('a', 'b', 'c');
// Output:
// a
// b
// c

你可能會想,發生了什麼事?! 如前所述,當呼叫函數時,arguments 會接收傳入 args()  函數的任何參數。所以,如果我們將 20 個參數傳遞給 args() 函數,我們將列印出 20 個參數。

Demo: https://jsbin.com/ciqabov/edit?js,console

Generators(生成器)

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

// generator-example.js
function* generator(){ 
  yield 1; 
  yield 2; 
  yield 3; 
}; 
 
for (const g of generator()) { 
  console.log(g); 
}
 
// Output:
// 1
// 2
// 3

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

Demo: https://jsbin.com/faviyi/edit?js,console

退出迭代

JavaScript 提供了四種已知的終止迴圈執行的方法:breakcontinuereturn 和 throw。讓我們來看一個例子:

const iterable = ['mini', 'mani', 'mo'];
 
for (const value of iterable) {
  console.log(value);
  break;
}
 
// Output:
// mini

在這個範例中,我們使用 break 關鍵字在一次執行後終止循環,所以只有 mini 被印出來。

Demo: https://jsbin.com/tisuken/edit?js,console

普通物件不可迭代

##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...of 對其進行操作時,會報錯:TypeError: obj[Symbol.iterator] is not a function

Demo: https://jsbin.com/sotidu/edit?js,console

#

我们可以通过将类数组(array-like)对象转换为数组来绕过它。该对象将具有一个 length 属性,其元素必须可以被索引。我们来看一个例子:

// object-example.js
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-like)或可迭代对象来创建一个新的 Array(数组) 实例。

Demo: https://jsbin.com/miwofin/edit?js,console

For…of vs For…in

for...in 循环将遍历对象的所有可枚举属性。

//for-in-example.js
Array.prototype.newArr = () => {};
Array.prototype.anotherNewArr = () => {};
const array = ['foo', 'bar', 'baz'];
 
for (const value in array) { 
  console.log(value);
}
// Outcome:
// 0
// 1
// 2
// newArr
// anotherNewArr

for...in 不仅枚举上面的数组声明,它还从构造函数的原型中查找继承的非枚举属性,在这个例子中,newArr 和 anotherNewArr 也会打印出来。

Demo: https://jsbin.com/quxojof/edit?js,console

for...of 更多用于特定于集合(如数组和对象),但不包括所有对象。

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

Array.prototype.newArr = () => {};
const array = ['foo', 'bar', 'baz'];
 
for (const value of array) { 
  console.log(value);
}
// Outcome:
// foo
// bar
// baz

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

Demo: https://jsbin.com/sakado/edit?js,console

小结

了解 for...of 循环的使用可以在开发过程中节省大量的时间。 希望本文帮助你在JavaScript开发中了解和编写更好的循环结构。 让你快乐编码!

完整的示例代码:https://github.com/codediger/javascript-for-of-loop

【相关推荐:javascript视频教程编程视频

以上是es6中數組可以用for of遍歷嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
了解usestate():綜合反應國家管理指南了解usestate():綜合反應國家管理指南Apr 25, 2025 am 12:21 AM

useState()isaReacthookusedtomanagestateinfunctionalcomponents.1)Itinitializesandupdatesstate,2)shouldbecalledatthetoplevelofcomponents,3)canleadto'stalestate'ifnotusedcorrectly,and4)performancecanbeoptimizedusinguseCallbackandproperstateupdates.

使用React的優點是什麼?使用React的優點是什麼?Apr 25, 2025 am 12:16 AM

ReactispupularduetoItsOmpontement,基於虛擬,虛擬詞,Richecosystem和declarativedation.1)基於組件的harchitectureallowslowsforreusableuipieces。

在React中調試:識別和解決共同問題在React中調試:識別和解決共同問題Apr 25, 2025 am 12:09 AM

todebugreactapplicationsefectefectionfection,usethestertate:1)proppropdrillingwithcontextapiorredux.2)使用babortControllerToptopRollerTopRollerTopRollerTopRollerTopRollerTopRollerTopRollerTopRollerTopRollerTopRaceeDitions.3)intleleassynChronOusOperations.3)

反應中的usestate()是什麼?反應中的usestate()是什麼?Apr 25, 2025 am 12:08 AM

usestate()inrectallowsStateMagementionInfunctionalComponents.1)ITSIMPLIFIESSTATEMAGEMENT,MACHECODEMORECONCONCISE.2)usetheprevcountfunctionToupdateStateBasedonitspReviousViousViousvalue,deveingingStaleStateissues.3)

usestate()與用戶ducer():為您的狀態需求選擇正確的掛鉤usestate()與用戶ducer():為您的狀態需求選擇正確的掛鉤Apr 24, 2025 pm 05:13 PM

selectUsestate()forsimple,獨立的variables; useusereducer()forcomplexstateLogicorWhenStatedIppedsonPreviousState.1)usestate()isidealForsImpleupDatesLikeToggGlikGlingaBglingAboolAboolAupDatingacount.2

使用usestate()管理狀態:實用教程使用usestate()管理狀態:實用教程Apr 24, 2025 pm 05:05 PM

useState優於類組件和其它狀態管理方案,因為它簡化了狀態管理,使代碼更清晰、更易讀,並與React的聲明性本質一致。 1)useState允許在函數組件中直接聲明狀態變量,2)它通過鉤子機制在重新渲染間記住狀態,3)使用useState可以利用React的優化如備忘錄化,提升性能,4)但需注意只能在組件頂層或自定義鉤子中調用,避免在循環、條件或嵌套函數中使用。

何時使用usestate()以及何時考慮替代狀態管理解決方案何時使用usestate()以及何時考慮替代狀態管理解決方案Apr 24, 2025 pm 04:49 PM

useUsestate()forlocalComponentStateMangementighatighation; 1)usestate()isidealforsimple,localforsimple.2)useglobalstate.2)useglobalstateSolutionsLikErcontExtforsharedState.3)

React的可重複使用的組件:增強代碼可維護性和效率React的可重複使用的組件:增強代碼可維護性和效率Apr 24, 2025 pm 04:45 PM

ReusableComponentsInrectenHanceCodainainability and效率byallowingDevelostEsteSeTheseTheseThesAmeCompOntionActActRossDifferentPartSofanApplicationorprojects.1)heSredunceRedUndenceNandSimplifyUpdates.2)yensureconsistencyInuserexperience.3)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。