目錄
结论
首頁 web前端 js教程 了解javascript中3種for循環風格以及何時使用它們

了解javascript中3種for循環風格以及何時使用它們

Nov 26, 2020 pm 05:39 PM
for迴圈 javascript

了解javascript中3種for循環風格以及何時使用它們

在學習任何開發語言時候,for迴圈是必不可少的一種語法,可能所有開發人員都會使用它。它非常經典,以至於每個開發語言都至少包括一個關於循環的語法版本。不過,在JavaScript種包含了三種不同的循環語法(如果再講究一點,也可以算是四種)。

它們的使用方式並不完全相同,舉例如下:

l  經典的For循環語法

l  For….of 和For…in

# #l  炫技一點的版本:.forEach

接下來,我想介紹下這三種文法使用時有什麼異同,以及在什麼時間怎樣使用它們才能收穫最棒的結果。好的,讓我們開始吧。

經典的For迴圈

這個語法我們應該都已經非常清楚了,在for迴圈中,你可以在其中定義內部計數器,設定對應中斷條件和靈活的步進策略(通常可以是遞增也可以是遞減)。

語法為:

for([计数器定义];[中断条件];[步进策略]){
   //... 
    TODO
}
登入後複製
我敢肯定即便不用我的介紹,之前你也一定寫過類似的語句,例如:

for(let counter = 0; counter 讓我們在Chrome裡運行一下,得到的結果也符合預期,但for迴圈就僅僅如此了嗎? <p><br></p><p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/image/758/933/751/1606383516520600.png" class="lazy" title="1606383516520600.png" alt="了解javascript中3種for循環風格以及何時使用它們"></p> 你可以認為for循環為三個表達式<p></p><pre class="brush:php;toolbar:false">for(
[在循环开始时只执行一次的表达式];
[其中每一个逻辑判断都需吻合的表达式];
[循环每一步都被执行的表达式]
)
登入後複製
這樣表述的意義在於,你可以使用多個計數器執行for循環,或在不影響計數器的情況下在步進表達式中執行每次需要執行的程式碼,舉個例子:

for(let a = 0, b = 0; a <p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/image/156/104/357/160638352246070了解javascript中3種for循環風格以及何時使用它們" class="lazy" title="160638352246070了解javascript中3種for循環風格以及何時使用它們" alt="了解javascript中3種for循環風格以及何時使用它們"></p>我們可以再進一步,讓其變的更符合實際應用場景:<p></p><pre class="brush:php;toolbar:false">for(let a = 0, b = 0; a <p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/image/534/927/536/160638352761244了解javascript中3種for循環風格以及何時使用它們" class="lazy" title="160638352761244了解javascript中3種for循環風格以及何時使用它們" alt="了解javascript中3種for循環風格以及何時使用它們"></p>另外,你甚至可以把中間表達式替換為函數調用,只要你記住,該函數的返回值需要是一個布林型或可以被轉成布林值的一個值即可,例如:<p></p><pre class="brush:php;toolbar:false">function isItDone(a) {
 console.log("函数被调用!")
 return a <p><img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/image/985/386/873/160638353227285了解javascript中3種for循環風格以及何時使用它們" class="lazy" title="160638353227285了解javascript中3種for循環風格以及何時使用它們" alt="了解javascript中3種for循環風格以及何時使用它們"></p>那麼,在經典的for迴圈中如何處理非同步程式碼呢?如何保證不掉進非同步陷阱裡呢? <p></p>我為大家介紹一位新朋友:async / await,這將讓我們在處理非同步程式碼時變得更容易、可控,例如:<p></p><pre class="brush:php;toolbar:false">const fs = require("fs")

async function read(fname) {
    return new Promise( (resolve, reject) => {
        fs.readFile(fname, (err, content) => {
            if(err) return reject(err)
            resolve(content.toString())
        })
    })
}

(async () => {
    let files = ['file1.json', 'file2.json']

    for(let i = 0; i For... in和For… of<h2></h2>他們看起來非常相似,但它們並不是相同類型的循環。 <p></p>讓我們盡量簡要的解釋它們:<p></p>For…in 循環遍歷物件的可枚舉屬性,也就是說當你的自訂物件被用作雜湊表或字典時,使用For…in 遍歷他們時將變得非常簡單。 <p></p>但請注意,遍歷順序是按元素順序執行執行的,因此請不要依賴循環順序。 <p></p><pre class="brush:php;toolbar:false">let myMap {
  uno: 1,
  dos: 2,
  tres: 3
}
for(let key in myMap) {
  console.log(key, "=", myMap[key]);
}
登入後複製
看起來是很簡單的,但請記住,For…in只能遍歷一個實體對象,如果便利一個非實體,例如遍歷一個string,那麼將會發生如下情況:

for(let k in "Hello World!") {
   console.log(k)
}
登入後複製

了解javascript中3種for循環風格以及何時使用它們

從結果可以看到,並沒有遍歷出每一個字母,而是遍歷到了每個屬性,正如您看到的,遍歷出的數字並非是沒有用的,因為"Hello World!"[1] 同樣是可以回傳對應的字母的。

相反,如果你想遍歷每個字符,則需要使用其他變體:For…of

for(let char of "Hello World!") {
  console.log(char)
}
登入後複製

了解javascript中3種for循環風格以及何時使用它們

這種循環方式看起來對string類型更有效,相同的用例,因為使用了這種語法,就能夠傳回元素中對應的值了。所以我們透過上述用例可知,For…of遍歷的內容是物件的值。

透過上述的範例我們可知,他們互相一個遍歷屬性,一個遍歷值,那麼有沒有什麼方法可以既獲得屬性又獲得值呢,答案是有的,使用entries方法,就可以同時獲得屬性和值,如下所示:

let myArr = ["hello", "world"]
for([idx, value] of myArr.entries()) {
    console.log(idx, '=', value)
}
登入後複製

了解javascript中3種for循環風格以及何時使用它們

最後,在處理非同步程式碼時是怎樣的呢?答案當然是跟for循環相同了。

const fs = require("fs")

async function read(fname) {
    return new Promise( (resolve, reject) => {
        fs.readFile(fname, (err, content) => {
            if(err) return reject(err)
            resolve(content.toString())
        })
    })
}



(async () => {
    let files = ['file2.json', 'file2.json']

    for(fname of files) {
        let fcontent = await read(fname)
        console.log(fcontent)
        console.log("-------")
    }

    for(idx in files) {
        let fcontent = await read(files[idx])
        console.log(fcontent)
        console.log("-------")
    }
})()
登入後複製
最後我們再用簡短的方式來總結下For…in和For…of的區別


For…in——遍歷屬性

For… of——遍歷值

.forEach 循環

這可能是我最喜歡的一個,這僅僅是因為我非常喜歡聲明式語法或透過命令式編寫程式碼的聲明性方式。

而且,儘管上面的循環語法也很好用,並且都有很好的用例,但當我們需要關注資料本身時,forEach很好用。

不管怎样,先撇开哲学上的争论不谈,.foreach方法是for循环的另一个版本,但是这个方法是数组对象的一部分,它的目的是接收一个函数和一个额外的可选参数,以便在执行函数时重新定义该函数的上下文。

对于数组中的每个元素,我们的函数都将被执行,并且它将收到三个参数(是的,就是三个,而不是一个,因为您已经习惯了使用它)。它们分别是:

  • 正在处理的当前元素。

  • 元素的索引,这已经简化了我们试图用for…of循环实现的任务

  • 正在处理的实际数组。以防万一你需要做点什么。

那么,让我们看一个简单的示例:

a = ["hello", "world"]

a.forEach ( (elem, idx, arr) => {
   console.log(elem, "at: ", idx, "inside: ", arr)
})
登入後複製

了解javascript中3種for循環風格以及何時使用它們

更快更简单,不是吗?

但是你可以看到我们如何在函数中很容易地使用所有属性。下面是一个您希望在foreach方法上使用第二个可选参数的示例:

class Person {
    constructor(name)  {
        this.name = name
    }
}

function greet(person) {
    console.log(this.greeting.replace("$", person.name))
}

let english = {
    greeting: "Hello there, $"
}
let spanish = {
    greeting: "Hola $, ¿cómo estás?"
}

let people = [new Person("Fernando"), new Person("Federico"), new Person("Felipe")]


people.forEach( greet, english)
people.forEach( greet, spanish)
登入後複製

通过重写被调用函数greet的上下文,我可以在不影响其代码的情况下更改其行为。

最后,显示此方法也可以与异步代码一起使用,下面是示例:

const fs = require("fs")

async function read(fname) {
    return new Promise( (resolve, reject) => {
        fs.readFile(fname, (err, content) => {
            if(err) return reject(err)
            resolve(content.toString())
        })
    })
}

let files = ['file1.json', 'file2.json']

files.forEach( async fname => {
    let fcontent = await read(fname)
    console.log(fcontent)
    console.log("-------")
})
登入後複製

结论

这就是我想要分享的关于JavaScript中关于循环的全部内容,我希望现在您对它们有了更清晰的理解,并且可以根据这些知识和我们当前的实际需求来选择您喜欢的循环。

原文地址:https://blog.bitsrc.io/3-flavors-of-the-for-loop-in-javascript-and-when-to-use-them-f0fb5501bdf3

更多编程相关知识,请访问:编程学习网站!!

以上是了解javascript中3種for循環風格以及何時使用它們的詳細內容。更多資訊請關注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脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
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)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

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

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

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

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

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

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

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

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

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

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

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

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript與WebSocket:打造高效率的即時影像處理系統 JavaScript與WebSocket:打造高效率的即時影像處理系統 Dec 17, 2023 am 08:41 AM

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數

See all articles