前言
作爲前端,雖然我們開發沒問題,但是遇到理論性的東西有時候需要一些專業的語言來描述,以此來達到面試官的要求。下面是我整理的一些面試題,有一些是特別基礎的,有一些是理論性的,還有一些是我在面試中答的不是很好的,在此整理,希望能幫助到更多的人.
面試題
-
js有哪些數據類型
string、number、boolean、array、object、null、undefined -
js創建數組的方式
var arrayObj = new Array()
var arrayObj = new Array(3)
var arrayObj = new Array(1,2,3)
var arrayObj = [1,2,3] -
{}與new Object()的區別是什麼?
這兩種創建對象方式,從測試效果來看,{}會快一點。
{} 這個叫做對象字面量
如果new Object()中沒有傳入參數,與{}是一樣的。
但是如果傳入不同的參數,會有不同的效果。
傳入String 返回String,類似new String()
傳入Number 返回Number,類似new Number()
傳入Object 返回Object,其實沒啥用
速度上{}會比new Object()快一點 -
instantof和typeof的區別
instanceof運算符:此運算符可以判斷一個變量是否是某個對象(類)的實例,返回值是布爾類型
typeof運算符:此運算符可以返回一個字符串(number、boolean、string、function、object、undefined),用於說明元算數的類型 -
阻止事件冒泡和捕獲以及阻止默認行爲
e.stopPropagation() // 阻止冒泡和捕獲
e.preventDefault() // 阻止默認行爲 -
字符串相關操作
數組轉字符串(join)
字符串轉數組(split)
字符串合併(concat)
檢索字符串(indexOf)
返回指定位置字符(charAt)
截取字符串(substr,substring,slice)區別:一個截取到第幾位,一個截取多少位
替換字符串(replace)
轉小寫字符(toLowerCase)
轉大寫字符(toUpperCase)
正則匹配(match)空
正則查找(search)-1 -
對象相關操作
刪除字段(delete)
轉json字符串(JSON.stringfy)
轉json對象(JSON.parse) -
數組操作
刪除數組元素(delete)長度不變
刪除/替換元素(splice)長度改變
添加元素(push)
刪除最後一個元素(pop)
頭部添加元素(unshift)
合併數組(concat)
排序(sort)
翻轉(reverse)
轉字符串(join,toString)
截取(slice) -
什麼是自執行函數?自執行函數的作用?
自執行函數就是創建一個匿名函數並執行
作用就是創建獨立作用域,避免變量污染 -
this的指向
全局環境下,this就代表window對象。
對象環境指向對象。
構造函數中的this 會指向創建出來的實例對象
在 DOM 事件中使用 this,this 指向了觸發事件的 DOM 元素本身 -
如何修改this的指向
可以使用局部變量來代替this指針
使用call 或 apply 方法
call中的第一個參數就是要更改this指向的對象,爲必選參數;
apply的作用和call一樣,不同的是傳參的形式。apply需要以數組的形式傳遞參數 -
Ajax實現步驟(5步)
a) 創建XMLHttpRequest對象
b) 設置回調函數
c) 使用OPEN方法與服務器建立連接(如果是post方式,設置請求頭信息)
d) 向服務端發送數據(如果是post方式,數據不爲空)
e) 在回調函數中針對不同的響應狀態進行處理 -
js垃圾回收機制
JS的垃圾回收機制是爲了以防內存泄漏,內存泄漏的含義就是當已經不需要某塊內存時這塊內存還存在着,垃圾回收機制就是間歇的不定期的尋找到不再使用的變量,並釋放掉它們所指向的內存。
javascript權威指南中的定義:
由於字符串、對象和數組沒有固定大小,所有當他們的大小已知時,才能對他們進行動態的存儲分配。JavaScript程序每次創建字符串、數組或對象時,解釋器都必須分配內存來存儲那個實體。只要像這樣動態地分配了內存,最終都要釋放這些內存以便他們能夠被再用,否則,JavaScript的解釋器將會消耗完系統中所有可用的內存,造成系統崩潰。 -
垃圾回收方式
1) 標記清除
這是javascript中最常用的垃圾回收方式。當變量進入執行環境是,就標記這個變量爲“進入環境”。從邏輯上講,永遠不能釋放進入環境的變量所佔用的內存,因爲只要執行流進入相應的環境,就可能會用到他們。當變量離開環境時,則將其標記爲“離開環境”。
垃圾收集器在運行的時候會給存儲在內存中的所有變量都加上標記。然後,它會去掉環境中的變量以及被環境中的變量引用的標記。而在此之後再被加上標記的變量將被視爲準備刪除的變量,原因是環境中的變量已經無法訪問到這些變量了。最後。垃圾收集器完成內存清除工作,銷燬那些帶標記的值,並回收他們所佔用的內存空間。
2) 引用計數
另一種不太常見的垃圾回收策略是引用計數。引用計數的含義是跟蹤記錄每個值被引用的次數。當聲明瞭一個變量並將一個引用類型賦值給該變量時,則這個值的引用次數就是1。相反,如果包含對這個值引用的變量又取得了另外一個值,則這個值的引用次數就減1。當這個引用次數變成0時,則說明沒有辦法再訪問這個值了,因而就可以將其所佔的內存空間給收回來。這樣,垃圾收集器下次再運行時,它就會釋放那些引用次數爲0的值所佔的內存。 -
變量的生命週期
當一個變量的生命週期結束之後它所指向的內存就應該被釋放。JS有兩種變量,全局變量和在函數中產生的局部變量。局部變量的生命週期在函數執行過後就結束了,此時便可將它引用的內存釋放(即垃圾回收),但全局變量生命週期會持續到瀏覽器關閉頁面。 -
js堆棧
堆和棧都是運行時內存中分配的一個數據區,因此也被稱爲堆區和棧區;
二者存儲的數據類型和處理速度不同;
堆(heap) 用於複雜數據類型(引用類型)分配空間,例如數組對象、object對象;它是運行時動態分配內存的,因此存取速度較慢。
棧(stack) 中主要存放一些基本類型的變量和對象的引用,其優勢是存取速度比堆要快,並且棧內的數據可以共享,但缺點是存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。 -
宏任務和微任務
宏任務(task):就是的 JS 內部(任務隊列裏)的任務,嚴格按照時間順序壓棧和執行。如 setTimeOut、setInverter、setImmediate 、 MessageChannel等
微任務(Microtask ):通常來說就是需要在當前 task 執行結束後立即執行的任務,例如需要對一系列的任務做出迴應,或者是需要異步的執行任務而又不需要分配一個新的 task,這樣便可以減小一點性能的開銷。microtask 任務隊列是一個與 task 任務隊列相互獨立的隊列,microtask 任務將會在每一個 task 任務執行結束之後執行。每一個 task 中產生的 microtask 都將會添加到 microtask 隊列中,microtask 中產生的 microtask 將會添加至當前隊列的尾部,並且 microtask 會按序的處理完隊列中的所有任務。microtask 類型的任務目前包括了 MutationObserver 以及 Promise 的回調函數。 -
漸進增強和優雅降級的區別
優雅降級:Web站點在所有新式瀏覽器中都能正常工作,如果用戶使用的是老式瀏覽器,則代碼會檢查以確認它們是否能正常工作。由於IE獨特的盒模型佈局問題,針對不同版本的IE的hack實踐過優雅降級了,爲那些無法支持功能的瀏覽器增加候選方案,使之在舊式瀏覽器上以某種形式降級體驗卻不至於完全失效.
漸進增強:從被所有瀏覽器支持的基本功能開始,逐步地添加那些只有新式瀏覽器才支持的功能,向頁面增加無害於基礎瀏覽器的額外樣式和功能的。當瀏覽器支持時,它們會自動地呈現出來並發揮作用。
-
標籤語義化的理解
1) 去掉或樣式丟失的時候能讓頁面呈現清晰的結構:html本身是沒有表現的,我們看到例如<h1>是粗體,字體大小2em,加粗;<strong>是加粗的,不要認爲這是html的表現,這些其實html默認的css樣式在起作用,所以去掉或樣式丟失的時候能讓頁面呈現清晰的結構不是語義化的HTML結構的優點,但是瀏覽器都有有默認樣式,默認樣式的目的也是爲了更好的表達html的語義,可以說瀏覽器的默認樣式和語義化的HTML結構是不可分割的。
2) 屏幕閱讀器(如果訪客有視障)會完全根據你的標記來“讀”你的網頁。
3) PDA、手機等設備可能無法像普通電腦的瀏覽器一樣來渲染網頁(通常是因爲這些設備對CSS的支持較弱)
4) 有利於SEO:和搜索引擎建立良好溝通,有助於爬蟲抓取更多的有效信息:爬蟲依賴於標籤來確定上下文和各個關鍵字的權重。
5) 便於團隊開發和維護,語義化更具可讀性,是下一步吧網頁的重要動向,遵循W3C標準的團隊都遵循這個標準,可以減少差異化。 -
對網站文件和資源優化
1) 文件合併文件最小化
2) 文件壓縮使用
3) CDN託管緩存的使用(多個域名來提供緩存) -
減少頁面加載時間的方法
1) 優化圖片
2) 圖像格式的選擇(GIF:提供的顏色較少,可用在一些對顏色要求不高的地方)
3) 優化CSS(壓縮合並css,如margin-top,margin-left…)
4) 網址後加斜槓(如www.campr.com/目錄,會判斷這個“目錄是什麼文件類型,或者是目錄。)
5) 標明高度和寬度(如果瀏覽器沒有找到這兩個參數,它需要一邊下載圖片一邊計算大小,如果圖片很多,瀏覽器需要不斷地調整頁面。這不但影響速度,也影響瀏覽體驗。當瀏覽器知道了高度和寬度參數後,即使圖片暫時無法顯示,頁面上也會騰出圖片的空位,然後繼續加載後面的內容。從而加載時間快了,瀏覽體驗也更好了。)
6) 減少http請求(合併文件,合併圖片) -
js面向對象的理解
ECMAScript 有兩種開發模式:1.函數式(過程化),2.面向對象(OOP)。面向對象的語言有一個標誌,那就是類的概念,而通過類可以創建任意多個具有相同屬性和方法的對象。但是,ECMAScript 沒有類的概念,因此它的對象也與基於類的語言中的對象有所不同。
js(如果沒有作特殊說明,本文中的js僅包含ES5以內的內容)本身是沒有class類型的,但是每個函數都有一個prototype屬性。prototype指向一個對象,當函數作爲構造函數時,prototype則起到類似class的作用。
創建方法:
1) 創建對象方法。
創建一個對象,然後給這個對象新建屬性和方法。
2) 構造函數方法
函數名和實例化構造名相同且大寫,(PS:非強制,但這麼寫有助於區分構造函數和普通函數);
通過構造函數創建對象,必須使用new 運算符 -
原型的理解
創建每一個函數都有一個prototype屬性,這個屬性其實是一個指針,這個指針總指向一個對象。這個對象的用途就是將特定的屬性和方法都包含在內,起到一個實例對象共享的作用。 -
原型鏈的理解
因爲每個對象和原型都有原型,對象的原型指向原型對象,而父的原型又指向父級的父級,這種原型層層連接起來的就構成了原型鏈。 -
什麼是閉包
閉包就是能夠讀取其他函數內部變量的函數。由於在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成“定義在一個函數內部的函數”。
所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋樑。閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。 -
閉包的優缺點
(1)由於閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
(2)閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。 -
常見的瀏覽器返回狀態嗎
200:請求成功
301/302: 重定向
401:未授權
403:無權限訪問
404:未找到頁面
500:服務器錯誤