在現(xiàn)代 Web 開發(fā)中,JavaScript 已經(jīng)成為不可或缺的一部分,任何完整的前端開發(fā)都會涉及到 JavaScript,也因此在面試的時候,JavaScript 面試題也成為了每個開發(fā)者不可避免的問題。今天,我們就來一起探討一下 JavaScript 面試題及其答案。
一、JS 的數(shù)據(jù)類型有哪些?如何判斷變量的數(shù)據(jù)類型?
JS 中數(shù)據(jù)類型分為基本數(shù)據(jù)類型和引用數(shù)據(jù)類型兩種,基本數(shù)據(jù)類型包括:Number、String、Boolean、Undefined、Null、Symbol(ES6 新增);引用數(shù)據(jù)類型包括:Object、Array、Function。
// 判斷變量類型的方法 typeof value // 返回變量類型的字符串表達式,例如 'number'、'string'、'boolean'、'undefined'、'object'、'function'、'symbol'(ES6 新增)。 Object.prototype.toString.call(value) // 返回格式 '[object 類型]' 的字符串,其中類型可以是 Object、Array、Function 等。例如:'[object Number]'、'[object String]'、'[object Object]'。二、什么是閉包?舉個例子說明其使用場景。
閉包是指一個函數(shù)內(nèi)部的函數(shù)可以訪問其外部函數(shù)的變量,即使外部函數(shù)已經(jīng)執(zhí)行完畢。閉包常用于保護私有變量,同時還可以使用柯里化技術(shù)、惰性加載等高級技術(shù)。
function parent() { var a = 10; function child() { console.log(a); } return child; } var result = parent(); // 執(zhí)行 parent 函數(shù),返回 child 函數(shù) result(); // 輸出 10三、JS 事件循環(huán)是什么?簡述其流程。
JS 的事件循環(huán)是指 JS 引擎通過一個消息隊列來維護事件的處理順序。當(dāng)瀏覽器接收到事件后,會將事件加入到消息隊列中,JS 引擎會不斷地從隊列中取出事件并處理。其中有兩種類型的任務(wù):宏任務(wù)(如 setTimeout、setInterval、 I/O 等)和微任務(wù)(如 Promise、process.nextTick、MutationObserver 等)。
事件循環(huán)的大致流程:
- 所有同步任務(wù)(一般指代碼都在主線程上執(zhí)行的任務(wù))都在主線程上執(zhí)行,形成一個同步任務(wù)執(zhí)行棧。
- 主線程上執(zhí)行的同步任務(wù)可能會調(diào)用異步任務(wù),異步任務(wù)會在后臺線程中執(zhí)行。異步任務(wù)執(zhí)行完畢后會產(chǎn)生一個事件加入到事件隊列中。
- 一旦主線程上的同步任務(wù)全部執(zhí)行完畢,就會讀取事件隊列中的事件。如果是微任務(wù),就執(zhí)行該任務(wù);如果是宏任務(wù),就檢查該任務(wù)的類型,如果是 setTimeout、setInterval 等,就將定時器的時間記錄下來,否則會直接執(zhí)行該任務(wù)。
- 重復(fù)上面的步驟,直到事件隊列中沒有任務(wù)。
JS 的繼承實現(xiàn)其實是通過原型鏈來完成的。每個 JS 對象都有一個隱式屬性 __proto__,指向其父對象的原型對象。通過將子類的原型對象指向父類的實例,就可以實現(xiàn)類的繼承。
// 父類 function Animal(name) { this.name = name; } Animal.prototype.walk = function() { console.log(this.name + '正在走路'); } // 子類 function Cat(name) { Animal.call(this, name); } Cat.prototype = Object.create(Animal.prototype); Cat.prototype.constructor = Cat; let tom = new Cat('Tom'); tom.walk(); // 輸出 Tom 正在走路以上僅為幾個基礎(chǔ)的 JavaScript 面試題,實際面試中可能還會有更加復(fù)雜的問題。因此,我們在平時學(xué)習(xí)的過程中,還需要不斷地加強自己對 JavaScript 的理解和應(yīng)用,才能夠更好地應(yīng)對各種考驗。
上一篇div 滑出樣式