Javascript面試題彙總

前言

作爲前端,雖然我們開發沒問題,但是遇到理論性的東西有時候需要一些專業的語言來描述,以此來達到面試官的要求。下面是我整理的一些面試題,有一些是特別基礎的,有一些是理論性的,還有一些是我在面試中答的不是很好的,在此整理,希望能幫助到更多的人.

面試題

  1. js有哪些數據類型
    string、number、boolean、array、object、null、undefined

  2. js創建數組的方式
    var arrayObj = new Array()
    var arrayObj = new Array(3)
    var arrayObj = new Array(1,2,3)
    var arrayObj = [1,2,3]

  3. {}與new Object()的區別是什麼?
    這兩種創建對象方式,從測試效果來看,{}會快一點。
    {} 這個叫做對象字面量
    如果new Object()中沒有傳入參數,與{}是一樣的。
    但是如果傳入不同的參數,會有不同的效果。
    傳入String 返回String,類似new String()
    傳入Number 返回Number,類似new Number()
    傳入Object 返回Object,其實沒啥用
    速度上{}會比new Object()快一點

  4. instantof和typeof的區別
    instanceof運算符:此運算符可以判斷一個變量是否是某個對象(類)的實例,返回值是布爾類型
    typeof運算符:此運算符可以返回一個字符串(number、boolean、string、function、object、undefined),用於說明元算數的類型

  5. 阻止事件冒泡和捕獲以及阻止默認行爲
    e.stopPropagation() // 阻止冒泡和捕獲
    e.preventDefault() // 阻止默認行爲

  6. 字符串相關操作
    數組轉字符串(join)
    字符串轉數組(split)
    字符串合併(concat)
    檢索字符串(indexOf)
    返回指定位置字符(charAt)
    截取字符串(substr,substring,slice)區別:一個截取到第幾位,一個截取多少位
    替換字符串(replace)
    轉小寫字符(toLowerCase)
    轉大寫字符(toUpperCase)
    正則匹配(match)空
    正則查找(search)-1

  7. 對象相關操作
    刪除字段(delete)
    轉json字符串(JSON.stringfy)
    轉json對象(JSON.parse)

  8. 數組操作
    刪除數組元素(delete)長度不變
    刪除/替換元素(splice)長度改變
    添加元素(push)
    刪除最後一個元素(pop)
    頭部添加元素(unshift)
    合併數組(concat)
    排序(sort)
    翻轉(reverse)
    轉字符串(join,toString)
    截取(slice)

  9. 什麼是自執行函數?自執行函數的作用?
    自執行函數就是創建一個匿名函數並執行
    作用就是創建獨立作用域,避免變量污染

  10. this的指向
    全局環境下,this就代表window對象。
    對象環境指向對象。
    構造函數中的this 會指向創建出來的實例對象
    在 DOM 事件中使用 this,this 指向了觸發事件的 DOM 元素本身

  11. 如何修改this的指向
    可以使用局部變量來代替this指針
    使用call 或 apply 方法
    call中的第一個參數就是要更改this指向的對象,爲必選參數;
    apply的作用和call一樣,不同的是傳參的形式。apply需要以數組的形式傳遞參數

  12. Ajax實現步驟(5步)
    a) 創建XMLHttpRequest對象
    b) 設置回調函數
    c) 使用OPEN方法與服務器建立連接(如果是post方式,設置請求頭信息)
    d) 向服務端發送數據(如果是post方式,數據不爲空)
    e) 在回調函數中針對不同的響應狀態進行處理

  13. js垃圾回收機制
    JS的垃圾回收機制是爲了以防內存泄漏,內存泄漏的含義就是當已經不需要某塊內存時這塊內存還存在着,垃圾回收機制就是間歇的不定期的尋找到不再使用的變量,並釋放掉它們所指向的內存。
    javascript權威指南中的定義:
    由於字符串、對象和數組沒有固定大小,所有當他們的大小已知時,才能對他們進行動態的存儲分配。JavaScript程序每次創建字符串、數組或對象時,解釋器都必須分配內存來存儲那個實體。只要像這樣動態地分配了內存,最終都要釋放這些內存以便他們能夠被再用,否則,JavaScript的解釋器將會消耗完系統中所有可用的內存,造成系統崩潰。

  14. 垃圾回收方式
    1) 標記清除
    這是javascript中最常用的垃圾回收方式。當變量進入執行環境是,就標記這個變量爲“進入環境”。從邏輯上講,永遠不能釋放進入環境的變量所佔用的內存,因爲只要執行流進入相應的環境,就可能會用到他們。當變量離開環境時,則將其標記爲“離開環境”。
    垃圾收集器在運行的時候會給存儲在內存中的所有變量都加上標記。然後,它會去掉環境中的變量以及被環境中的變量引用的標記。而在此之後再被加上標記的變量將被視爲準備刪除的變量,原因是環境中的變量已經無法訪問到這些變量了。最後。垃圾收集器完成內存清除工作,銷燬那些帶標記的值,並回收他們所佔用的內存空間。
    2) 引用計數
    另一種不太常見的垃圾回收策略是引用計數。引用計數的含義是跟蹤記錄每個值被引用的次數。當聲明瞭一個變量並將一個引用類型賦值給該變量時,則這個值的引用次數就是1。相反,如果包含對這個值引用的變量又取得了另外一個值,則這個值的引用次數就減1。當這個引用次數變成0時,則說明沒有辦法再訪問這個值了,因而就可以將其所佔的內存空間給收回來。這樣,垃圾收集器下次再運行時,它就會釋放那些引用次數爲0的值所佔的內存。

  15. 變量的生命週期
    當一個變量的生命週期結束之後它所指向的內存就應該被釋放。JS有兩種變量,全局變量和在函數中產生的局部變量。局部變量的生命週期在函數執行過後就結束了,此時便可將它引用的內存釋放(即垃圾回收),但全局變量生命週期會持續到瀏覽器關閉頁面。

  16. js堆棧
    堆和棧都是運行時內存中分配的一個數據區,因此也被稱爲堆區和棧區;
    二者存儲的數據類型和處理速度不同;
    堆(heap) 用於複雜數據類型(引用類型)分配空間,例如數組對象、object對象;它是運行時動態分配內存的,因此存取速度較慢。
    棧(stack) 中主要存放一些基本類型的變量和對象的引用,其優勢是存取速度比堆要快,並且棧內的數據可以共享,但缺點是存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。

  17. 宏任務和微任務
    宏任務(task):就是的 JS 內部(任務隊列裏)的任務,嚴格按照時間順序壓棧和執行。如 setTimeOut、setInverter、setImmediate 、 MessageChannel等
    微任務(Microtask ):通常來說就是需要在當前 task 執行結束後立即執行的任務,例如需要對一系列的任務做出迴應,或者是需要異步的執行任務而又不需要分配一個新的 task,這樣便可以減小一點性能的開銷。microtask 任務隊列是一個與 task 任務隊列相互獨立的隊列,microtask 任務將會在每一個 task 任務執行結束之後執行。每一個 task 中產生的 microtask 都將會添加到 microtask 隊列中,microtask 中產生的 microtask 將會添加至當前隊列的尾部,並且 microtask 會按序的處理完隊列中的所有任務。microtask 類型的任務目前包括了 MutationObserver 以及 Promise 的回調函數。

  18. 漸進增強和優雅降級的區別
    優雅降級:Web站點在所有新式瀏覽器中都能正常工作,如果用戶使用的是老式瀏覽器,則代碼會檢查以確認它們是否能正常工作。由於IE獨特的盒模型佈局問題,針對不同版本的IE的hack實踐過優雅降級了,爲那些無法支持功能的瀏覽器增加候選方案,使之在舊式瀏覽器上以某種形式降級體驗卻不至於完全失效.

漸進增強:從被所有瀏覽器支持的基本功能開始,逐步地添加那些只有新式瀏覽器才支持的功能,向頁面增加無害於基礎瀏覽器的額外樣式和功能的。當瀏覽器支持時,它們會自動地呈現出來並發揮作用。

  1. 標籤語義化的理解
    1) 去掉或樣式丟失的時候能讓頁面呈現清晰的結構:html本身是沒有表現的,我們看到例如<h1>是粗體,字體大小2em,加粗;<strong>是加粗的,不要認爲這是html的表現,這些其實html默認的css樣式在起作用,所以去掉或樣式丟失的時候能讓頁面呈現清晰的結構不是語義化的HTML結構的優點,但是瀏覽器都有有默認樣式,默認樣式的目的也是爲了更好的表達html的語義,可以說瀏覽器的默認樣式和語義化的HTML結構是不可分割的。
    2) 屏幕閱讀器(如果訪客有視障)會完全根據你的標記來“讀”你的網頁。
    3) PDA、手機等設備可能無法像普通電腦的瀏覽器一樣來渲染網頁(通常是因爲這些設備對CSS的支持較弱)
    4) 有利於SEO:和搜索引擎建立良好溝通,有助於爬蟲抓取更多的有效信息:爬蟲依賴於標籤來確定上下文和各個關鍵字的權重。
    5) 便於團隊開發和維護,語義化更具可讀性,是下一步吧網頁的重要動向,遵循W3C標準的團隊都遵循這個標準,可以減少差異化。

  2. 對網站文件和資源優化
    1) 文件合併文件最小化
    2) 文件壓縮使用
    3) CDN託管緩存的使用(多個域名來提供緩存)

  3. 減少頁面加載時間的方法
    1) 優化圖片
    2) 圖像格式的選擇(GIF:提供的顏色較少,可用在一些對顏色要求不高的地方)
    3) 優化CSS(壓縮合並css,如margin-top,margin-left…)
    4) 網址後加斜槓(如www.campr.com/目錄,會判斷這個“目錄是什麼文件類型,或者是目錄。)
    5) 標明高度和寬度(如果瀏覽器沒有找到這兩個參數,它需要一邊下載圖片一邊計算大小,如果圖片很多,瀏覽器需要不斷地調整頁面。這不但影響速度,也影響瀏覽體驗。當瀏覽器知道了高度和寬度參數後,即使圖片暫時無法顯示,頁面上也會騰出圖片的空位,然後繼續加載後面的內容。從而加載時間快了,瀏覽體驗也更好了。)
    6) 減少http請求(合併文件,合併圖片)

  4. js面向對象的理解
    ECMAScript 有兩種開發模式:1.函數式(過程化),2.面向對象(OOP)。面向對象的語言有一個標誌,那就是類的概念,而通過類可以創建任意多個具有相同屬性和方法的對象。但是,ECMAScript 沒有類的概念,因此它的對象也與基於類的語言中的對象有所不同。
    js(如果沒有作特殊說明,本文中的js僅包含ES5以內的內容)本身是沒有class類型的,但是每個函數都有一個prototype屬性。prototype指向一個對象,當函數作爲構造函數時,prototype則起到類似class的作用。
    創建方法:
    1) 創建對象方法。
    創建一個對象,然後給這個對象新建屬性和方法。
    2) 構造函數方法
    函數名和實例化構造名相同且大寫,(PS:非強制,但這麼寫有助於區分構造函數和普通函數);
    通過構造函數創建對象,必須使用new 運算符

  5. 原型的理解
    創建每一個函數都有一個prototype屬性,這個屬性其實是一個指針,這個指針總指向一個對象。這個對象的用途就是將特定的屬性和方法都包含在內,起到一個實例對象共享的作用。

  6. 原型鏈的理解
    因爲每個對象和原型都有原型,對象的原型指向原型對象,而父的原型又指向父級的父級,這種原型層層連接起來的就構成了原型鏈。

  7. 什麼是閉包
    閉包就是能夠讀取其他函數內部變量的函數。由於在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成“定義在一個函數內部的函數”。
    所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋樑。閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。

  8. 閉包的優缺點
    (1)由於閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
    (2)閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。

  9. 常見的瀏覽器返回狀態嗎
    200:請求成功
    301/302: 重定向
    401:未授權
    403:無權限訪問
    404:未找到頁面
    500:服務器錯誤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章