日韩欧美人妻无码精品白浆,夜夜嗨AV免费入口,国产欧美官网在线看,高校回应聋哑女生因长相完美被质疑

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

JavaScript 開發(fā)中的常見面試問題

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

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

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

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

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");

你能預(yù)測輸出嗎?我看看。在上面的代碼中,首先記錄消息 Start、Middle 和 End,因?yàn)樗鼈兪峭酱a。之后,打印 Task 2 complete,然后打印 Task 1 complete這是因?yàn)?setTimeout 是異步的,它的回調(diào)只有在同步代碼完成運(yùn)行后才會(huì)執(zhí)行。

如何在 JavaScript 中實(shí)現(xiàn)異步操作

JavaScript 使用 Promise 處理異步操作。Promise 是一個(gè)對(duì)象,它表示異步操作的最終完成(或失?。?。當(dāng) Promise 解析或拒絕時(shí),它的回調(diào)被放置在微任務(wù)隊(duì)列中。

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


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");

你能預(yù)測輸出嗎?我看看。在上面的代碼中,首先記錄 Start 和 End,因?yàn)樗鼈兪峭酱a。1 秒后,Promise 解析并記錄 Promise Resolved。發(fā)生這種情況是因?yàn)槭录h(huán)僅在同步代碼完成后才處理微任務(wù)隊(duì)列。

為什么你應(yīng)該避免阻塞 JavaScript 中的主線程

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


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");

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

JavaScript 如何執(zhí)行代碼

JavaScript 是一種單線程語言,這意味著它按順序執(zhí)行代碼,一次執(zhí)行一個(gè)任務(wù)。當(dāng) JavaScript 代碼運(yùn)行時(shí),它會(huì)創(chuàng)建一個(gè)全局執(zhí)行上下文并將其推送到調(diào)用堆棧上。此全局執(zhí)行上下文包含所有全局變量、函數(shù)和引用,例如 this 和 window 對(duì)象。

每當(dāng)調(diào)用函數(shù)時(shí),JavaScript 都會(huì)為該函數(shù)創(chuàng)建一個(gè)新的執(zhí)行上下文,并將其推送到調(diào)用堆棧上。然后 JavaScript 執(zhí)行函數(shù)內(nèi)的代碼。函數(shù)完成運(yùn)行后,其執(zhí)行上下文將從調(diào)用堆棧中彈出,將控制權(quán)返回給前一個(gè)上下文。


const language = "JavaScript";

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

console.log(language);

print();

執(zhí)行上述代碼時(shí),JavaScript 會(huì)創(chuàng)建一個(gè)全局執(zhí)行上下文,其中包括全局變量 language 和函數(shù) print() 這個(gè)函數(shù)執(zhí)行從打印 language 變量的值開始,即 JavaScript,接下來調(diào)用 print() 函數(shù),為其創(chuàng)建一個(gè)新的執(zhí)行上下文。在 print() 函數(shù)中,消息 Follow @amitrai_dev for more such articles! 被打印到控制臺(tái)。print() 函數(shù)完成后,其執(zhí)行上下文將從調(diào)用堆棧中刪除。最后,全局執(zhí)行上下文結(jié)束,標(biāo)志著程序的結(jié)束。

什么是 JavaScript 中的事件循環(huán)

JavaScript 中的事件循環(huán)是一種監(jiān)控調(diào)用堆棧和任務(wù)隊(duì)列的機(jī)制。當(dāng)調(diào)用堆棧為空時(shí),事件循環(huán)從任務(wù)隊(duì)列中獲取回調(diào)函數(shù),并將它們推送到調(diào)用堆棧上執(zhí)行。任務(wù)隊(duì)列有兩種類型:任務(wù)隊(duì)列(或宏任務(wù)隊(duì)列)和微任務(wù)隊(duì)列(或優(yōu)先級(jí)隊(duì)列)。微任務(wù)隊(duì)列具有更高的優(yōu)先級(jí),并在任務(wù)隊(duì)列之前處理。事件循環(huán)通過管理異步操作來創(chuàng)造多線程的錯(cuò)覺,即使 JavaScript 本身是單線程的。

console.log("Start");

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

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

console.log("End");

你能預(yù)測輸出嗎?讓我們來分析一下。在上面的代碼中,首先記錄 Start 和 End,因?yàn)樗鼈兪峭讲僮鳌,F(xiàn)在接下來打印什么?您能猜到它是 setTimeout 代碼還是 Promise 代碼嗎?提示如下:微任務(wù)在宏任務(wù)之前執(zhí)行。

Promise 回調(diào)的優(yōu)先級(jí)更高,因?yàn)樗煌扑偷?Microtask Queue(優(yōu)先級(jí)隊(duì)列),而 setTimeout 回調(diào)被推送到 Task Queue(宏任務(wù)隊(duì)列)。因此,事件循環(huán)在 Task Queue 之前處理 Microtask Queue。因此,將首先打印 Promise Resolved。一旦微任務(wù)隊(duì)列為空,事件循環(huán)就會(huì)處理任務(wù)隊(duì)列,打印 Timeout。

結(jié)論

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

本文首發(fā)于公眾號(hào)“web前端開發(fā)之旅”,轉(zhuǎn)載請(qǐng)注明出處!


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