我們開始使用內置的forEach方法:
myArray.forEach(function (value) {
寫法簡單了許多,但也有短處:你不能中斷循環(使用break語句或使用return語句。)
還有一種for-of循環
它的for-of的語法:
for-of循環使用例子:
循環一個字符串:
循環一個Map:
循環一個數組(Array);
我們可以使用const來替代let,這樣它就變成了在循環里的不可修改的靜態變量。
循環一個擁有enumerable屬性的對象:
for–of循環并不能直接使用在普通的對象上,但如果我們按對象所擁有的屬性進行循環,可使用內置的Object.keys()方法:
切版 qieban(.cn)
編寫程序時,我們經常需要重復執行某些操作,這時候循環結構就顯得非常有用。JavaScript 提供了多種循環結構,以適應不同的編程場景。以下是 JavaScript 中常見的循環結構:
for 循環是最常見的循環結構之一,它允許我們指定循環開始前的初始化代碼、循環繼續的條件以及每次循環結束時要執行的代碼。
for (初始化表達式; 循環條件; 循環后的操作表達式) {
// 循環體代碼
}
for (var i=1; i <=10; i++) {
console.log(i);
}
while 循環在給定條件為真時將不斷循環執行代碼塊。與 for 循環不同,while 循環只有循環條件,沒有初始化和迭代表達式。
while (條件) {
// 循環體代碼
}
var i=1;
while (i <=10) {
console.log(i);
i++;
}
do...while 循環和 while 循環類似,但它至少會執行一次循環體,無論條件是否為真。
do {
// 循環體代碼
} while (條件);
var i=1;
do {
console.log(i);
i++;
} while (i <=10);
for...in 循環用于遍歷對象的屬性。
for (var key in 對象) {
// 使用 key 訪問對象屬性
}
var person={
name: "張三",
age: 30,
job: "軟件工程師"
};
for (var key in person) {
console.log(key + ": " + person[key]);
}
for...of 循環用于遍歷可迭代對象(如數組、字符串等)的元素。
for (var item of 可迭代對象) {
// 使用 item 訪問元素
}
var fruits=["蘋果", "香蕉", "橘子"];
for (var fruit of fruits) {
console.log(fruit);
}
JavaScript 的循環結構為我們提供了強大的工具來處理重復任務。for 循環適合于當我們知道循環次數時使用;while 和 do...while 循環適合于循環次數未知,但是循環條件明確的情況;for...in 和 for...of 循環則讓對象和數組的遍歷變得更加簡潔。掌握這些循環結構有助于我們編寫更加高效和可讀性更強的代碼。
s是單線程的語言,單線程是指所有的程序路徑按照一定的順序執行,只有前面的程序執行了,后面的程序才會執行。
也就是說在同一時間,js只能做一件事情,為了協調瀏覽器產生的各種事件、網絡處理、前端渲染等行為,js的事件循環機制,即EventLoop應運而生。
JavaScript是單線程的原因
js的設計初衷是作為瀏覽器的腳本語言,瀏覽器中涉及到與用戶互動、頻繁操作DOM等動作,如果js設計為多線程,會有很復雜的線程同步問題,即使同步問題被解決,也會降低瀏覽器的響應效率,得不償失,因此,JavaScript被設計為單線程保證瀏覽器動作的一致性。
事件循環(EventLoop)
JavaScript既然被設計為單線程,是如何做到異步的呢?這時就用到了JavaScript的事件循環機制。
如下圖所示為JavaScript事件循環的原理圖。
如圖所示,事件循環是主線程循環讀取任務隊列中的任務,直到所有的任務都被執行。在事件循環中,JavaScript用到了棧、堆以及隊列等數據結構。
棧中存放的是執行上下文,有函數被調用時,就會創建上下文存放在執行棧中。
堆中表示一個非結構化的內存區域,用來存放對象。隊列是指任務隊列,用于存放異步任務。
js引擎遇到一個異步事件之后不會一直等待事件的返回結果,而是將事件掛起,繼續執行執行棧中的其他任務。
當異步事件返回結果時,js將異步事件callback函數放入隊列中,被放入隊列中的異步事件不會立即回調,等到當前執行棧中的任務都執行完成,處于閑置狀態的主線程按照隊列順序將處于首位事件的callback函數放入執行棧中,執行該函數的同步代碼,如果遇到了異步事件,同樣也會將其回調函數放入事件隊列中......
如此反復,就形成了一個無限循環,這也是被稱為“事件循環(EventLoop)”的原因。
宏任務(Micro task)和微任務(Macro task)
js事件循環的基本原理已經描述清楚,但是異步任務之間也有所不同。
上面講到,js在執行異步任務時,回調函數會被放在js的任務隊列中,實際上,回調函數的類別不同,執行的優先級也不同。
不同的優先級被分為兩類,一類是宏任務(Micro task),一類是微任務(Macro task)。
回調函數是微任務時,會被放在微任務隊列,回調函數是宏任務時,會被放在宏任務隊列。微任務的優先級高于宏任務,當主線程的任務執行完成時,會首先去執行微任務隊列中首位的回調函數,當微任務隊列中為空時,才回去執行宏任務隊列中的回調函數。
常見的微任務有:promise,常見的宏任務有setInterval等。
因此,事件循環的執行流程圖如下所示:
1)關注+私信回復:“測試”,可以免費領取一份10G軟件測試工程師面試寶典文檔資料。以及相對應的視頻學習教程免費分享!,其中包括了有基礎知識、Linux必備、Mysql數據庫、抓包工具、接口測試工具、測試進階-Python編程、Web自動化測試、APP自動化測試、接口自動化測試、測試高級持續集成、測試架構開發測試框架、性能測試等。
2)關注+私信回復:"入群" 就可以邀請你進入軟件測試群學習交流~~
*請認真填寫需求信息,我們會在24小時內與您取得聯系。