狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

JavaScript 開發中的常見面試問題

admin
2024年11月29日 9:31 本文熱度 589

在本文中,我們將探討許多開發人員難以解決的 JavaScript 面試問題,但這些是 JavaScript 的基本原理。掌握它們不僅可以提高您的面試成績,還可以提高您創建和調試 JavaScript 代碼的能力。

JavaScript 是單線程語言還是多線程語言?

JavaScript 是一種單線程語言,這意味著它使用單個調用堆棧來執行代碼。它按順序一次處理一個任務,每個任務都需要在下一個任務開始之前完成。因此,JavaScript 無法一次運行多個任務。

console.log("Start");

setTimeout(() => {
  console.log("Task 1 complete");
}, 2000); // Simulate a task that takes 2 seconds

console.log("Middle");

setTimeout(() => {
  console.log("Task 2 complete");
}, 1000); // Simulate a task that takes 1 second

console.log("End");

你能預測輸出嗎?我看看。在上面的代碼中,首先記錄消息 Start、Middle 和 End,因為它們是同步代碼。之后,打印 Task 2 complete,然后打印 Task 1 complete這是因為 setTimeout 是異步的,它的回調只有在同步代碼完成運行后才會執行。

如何在 JavaScript 中實現異步操作

JavaScript 使用 Promise 處理異步操作。Promise 是一個對象,它表示異步操作的最終完成(或失敗)。當 Promise 解析或拒絕時,它的回調被放置在微任務隊列中。

事件循環通過在空閑時將回調推送到調用堆棧上來處理這些回調,從而確保異步操作得到有效管理并且不會阻塞主線程。


console.log("Start");

// Creating a Promise that resolves after 1 second
const promise = new Promise((resolve) => {
  setTimeout(() => {
    resolve("Promise Resolved");
  }, 1000);
});

// Adding a callback to be executed when the Promise resolves
promise.then((message) => {
  console.log(message);
});

console.log("End");

你能預測輸出嗎?我看看。在上面的代碼中,首先記錄 Start 和 End,因為它們是同步代碼。1 秒后,Promise 解析并記錄 Promise Resolved。發生這種情況是因為事件循環僅在同步代碼完成后才處理微任務隊列。

為什么你應該避免阻塞 JavaScript 中的主線程

JavaScript 是一種單線程語言,這意味著如果主線程被阻塞,則在當前任務完成之前,其他代碼都無法運行。這可能會導致顯著的減速,甚至導致應用程序崩潰。為了保持流暢的性能并確保應用程序保持響應,最佳做法是避免阻塞主線程。你可以使用 Promise 和 async/await 來有效地處理異步任務。


console.log("Start");

// Blocking the main thread with a long-running operation
function blockMainThread({
  const start = Date.now();
  while (Date.now() - start < 3000) {
    // Busy-wait for 3 seconds
  }
  console.log("Blocking Operation Complete");
}

blockMainThread();

console.log("End");

你能預測輸出嗎?讓我們來分析一下。在上面的代碼中,首先打印 Start。然后調用 blockMainThread() 函數。在此函數中,一個名為 start 的變量被初始化為當前時間。while 循環一直運行到 3 秒過去 (Date.now() - start < 3000)。此循環會阻止主線程,因為它會一直運行,從而阻止執行任何其他代碼。循環完成后,將記錄 Blocking Operation Complete,然后記錄 End

JavaScript 如何執行代碼

JavaScript 是一種單線程語言,這意味著它按順序執行代碼,一次執行一個任務。當 JavaScript 代碼運行時,它會創建一個全局執行上下文并將其推送到調用堆棧上。此全局執行上下文包含所有全局變量、函數和引用,例如 this 和 window 對象。

每當調用函數時,JavaScript 都會為該函數創建一個新的執行上下文,并將其推送到調用堆棧上。然后 JavaScript 執行函數內的代碼。函數完成運行后,其執行上下文將從調用堆棧中彈出,將控制權返回給前一個上下文。


const language = "JavaScript";

function print({
  console.log("Follow @amitrai_dev for more such articles!");
}

console.log(language);

print();

執行上述代碼時,JavaScript 會創建一個全局執行上下文,其中包括全局變量 language 和函數 print() 這個函數執行從打印 language 變量的值開始,即 JavaScript,接下來調用 print() 函數,為其創建一個新的執行上下文。在 print() 函數中,消息 Follow @amitrai_dev for more such articles! 被打印到控制臺。print() 函數完成后,其執行上下文將從調用堆棧中刪除。最后,全局執行上下文結束,標志著程序的結束。

什么是 JavaScript 中的事件循環

JavaScript 中的事件循環是一種監控調用堆棧和任務隊列的機制。當調用堆棧為空時,事件循環從任務隊列中獲取回調函數,并將它們推送到調用堆棧上執行。任務隊列有兩種類型:任務隊列(或宏任務隊列)和微任務隊列(或優先級隊列)。微任務隊列具有更高的優先級,并在任務隊列之前處理。事件循環通過管理異步操作來創造多線程的錯覺,即使 JavaScript 本身是單線程的。

console.log("Start");

setTimeout(() => console.log("Timeout"), 0);

Promise.resolve().then(() => console.log("Promise Resolved"));

console.log("End");

你能預測輸出嗎?讓我們來分析一下。在上面的代碼中,首先記錄 Start 和 End,因為它們是同步操作。現在接下來打印什么?您能猜到它是 setTimeout 代碼還是 Promise 代碼嗎?提示如下:微任務在宏任務之前執行。

Promise 回調的優先級更高,因為它被推送到 Microtask Queue(優先級隊列),而 setTimeout 回調被推送到 Task Queue(宏任務隊列)。因此,事件循環在 Task Queue 之前處理 Microtask Queue。因此,將首先打印 Promise Resolved。一旦微任務隊列為空,事件循環就會處理任務隊列,打印 Timeout。

結論

這就是這篇文章的全部內容。我希望你覺得它有用。在面試前準備這些問題對于確保您的 JavaScript 基礎知識扎實非常有幫助,這將幫助您在面試中脫穎而出。

本文首發于公眾號“web前端開發之旅”,轉載請注明出處!


該文章在 2024/11/29 9:31:01 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved