js前端面試資料整理(純理論)

js面試資料(純理論)整理

1、js數據類型

數字、字符串、數組、布爾值、對象、null、undefined

2、js typeof 返回的數據類型

object、number、function、boolean、undefined、string

3、原型對象

每一個javascript對象(null除外)都和另一個對象(原型)關聯,每一個對象都從原型繼承屬性。 原型對象其實就是普通對象(Function.prototype除外,它是函數對象,但它很特殊,他沒有prototype屬性(前面說道函數對象都有prototype屬性))。每個對象都有 __proto__ 屬性,但只有函數對象纔有 prototype 屬性。實例的構造函數屬性(constructor)指向構造函數。
原型對象(Person.prototype)是 構造函數(Person)的一個實例。原型對象用於繼承。

4、原型鏈

JS在創建對象(不論是普通對象還是函數對象)的時候,都有一個叫做__proto__的內置屬性,用於指向創建它的函數對象的原型對象prototype。person.prototype對象也有__proto__屬性,它指向創建它的函數對象(Object)的prototype。Object.prototype對象也有__proto__屬性,但它比較特殊,爲null。我們把這個有__proto__串起來的直到Object.prototype.__proto__爲null的鏈叫做原型鏈。

5、繼承

原理:子構造函數中執行父構造函數,並用call\apply改變this;克隆父構造函數原型上的方法。
實現方式:1.原型鏈繼承(引用類型共享、無法向父類型傳參),2.構造函數繼承(函數不能複用),3.組合繼承(創建一次實例,調用兩次父類構造函數),4.寄生式繼承,5.寄生組合式繼承,6.原型式繼承

6、call()和apply()的區別

作用一樣,區別在於傳遞的參數不一樣,都可以用來替代另一個對象調用一個方法,將一個函數的對象上下文從初始的上下文改變爲由thisObj指定的新對象。

7、閉包

閉包是能夠讀取其他函數內部變量的函數,是定義在一個函數內部的函數,閉包是可以包含自由變量的代碼塊,這些變量不是在這個代碼塊或者任何全局上下文中定義的,而是在定義代碼塊的環境中定義。
特點:函數嵌套函數,內部函數可以訪問外部函數的變量,參數和變量不會被回收。
用途:讀取函數內部變量,設計私有變量與方法,讓變量始終保存在內存中。
缺點:消耗內存,容易造成內存泄漏。

8、事件委託

利用事件冒泡原理,讓父元素代替執行自己所觸發的事件。

9、阻止事件冒泡和默認事件

阻止冒泡:window.event.cancelBubble=true;event.stopPropagation();
阻止默認事件:window.event.returnValue=false;event.preventDefault();return false;

10、三個使用this的典型應用

事件: 如onclick this->發生事件的對象;
構造函數: this->new 出來的object;
call/apply: 改變this

11、深度拷貝

var newObj = $.extend(true,{},oldObjs)

12、同源策略

Js只能與同一個域中的頁面進行通訊,同一個域是指協議相同,端口相同,域名相同。

13、跨域方案

1、jsonp跨域(動態創建script標籤),
2、document.domain + iframe跨域;
3、 location.hash + iframe;
4、 window.name + iframe跨域;
5、 postMessage跨域;
6、 跨域資源共享(CORS);
7、 nginx代理跨域;
8、 nodejs中間件代理跨域;
9、 WebSocket協議跨域

14、new操作符的過程

1、創建一個空對象;
2、將構造函數的作用域賦給新對象(this指向新對象);
3、執行構造函數(新對象添加屬性);
4、返回新對象

15、this指向問題

this 指的是當前對象,如果在全局範圍內使用this,則指代當前頁面window;
如果在函數中使用this,則this指代什麼是根據當前函數是在什麼對象上調用;構造函數或者構造函數原型對象中this指向構造函數的實例。
我們可以使用call和apply改變函數中this的具體指向。
箭頭函數的this綁定看的是this所在的函數定義在哪個對象下,綁定到哪個對象則this就指向哪個對象,如果有對象嵌套的情況,則this綁定到最近的一層對象上

16、箭頭函數和普通函數的區別

1、箭頭函數是匿名函數,不能作爲構造函數,不能使用new;
2、箭頭函數不綁定arguments,取而代之用rest參數...解決;
3、箭頭函數不綁定this,會捕獲其所在的上下文的this值,作爲自己的this值;
4、箭頭函數通過 call() 或 apply() 方法調用一個函數時,只傳入了一個參數,對 this 並沒有影響;
5、箭頭函數沒有原型屬性;
6、箭頭函數不能當做Generator函數,不能使用yield關鍵字

17、ajax原理

Ajax是異步的javascript和xml,通過後臺與服務器進行少量數據交換使網頁實現異步更新。
交互模型:1、創建XMLHttpRequest對象;2、open打開url通道並設置異步傳輸;3、send發送數據到服務器;4、服務器接受數據並處理,處理完後返回結果;5客戶端接受服務器返回結果。
同步和異步的區別:同步,腳本會停留並等待服務器發送回覆然後再繼續;異步,腳本允許頁面繼續進程並處理可能的回覆。

18、js異步處理原理

每一個任務有一個或多個回調函數(callback),前一個任務結束後,不是執行後一個任務,而是執行回調函數,後一個任務則是不等前一個任務結束就執行,所以程序的執行順序與任務的排列順序是不一致的、異步的。異步函數,如setTimeout和setInterval,是被壓入了稱之爲Event Loop的隊列。Event Loop是一個回調函數隊列。當異步函數執行時,回調函數會被壓入這個隊列。JavaScript引擎直到異步函數執行完成後,纔會開始處理事件循環。這意味着JavaScript代碼不是多線程的,即使表現的行爲相似。事件循環是一個先進先出(FIFO)隊列,這說明回調是按照它們被加入隊列的順序執行的。

19、回調地獄

JS異步編程,或使用大量回調函數時,其代碼閱讀起來晦澀難懂,並不直觀。
處理回調地獄:1.減少代碼嵌套;2.模塊化;3.處理每一個錯誤。總結:不要嵌套函數,命名後調用更好;使用函數提升;處理回調函數的每一個錯誤;創建可重用函數,寫成模塊,讓你更容易讀懂代碼。把你的代碼拆分成小塊可以幫助你處理錯誤,寫測試,重構,方便爲你的代碼寫更穩定的API

20、Cookie、sessionStorage、localStorage的區別

cookie:生命週期爲只在設置的cookie過期時間內,存放大小爲4K左右,有個數限制,與服務器通信。
sessionStorage:僅在當前會話下有效,關閉瀏覽器後被清除,大小一般爲5M左右,僅在客戶端保存,不參與和服務器通信。
localStorage:生命週期永久,大小一般爲5M左右,僅在客戶端保存,不參與服務器通信。

21、模塊化的過程

1、將系統拆分分割爲一個一個的獨立部分;
2、將功能和特徵相似的部分組合在一起構成資源塊;
3、將資源塊放到固定地方調用

22、瀏覽器內核

Ie(Ie內核)、 火狐(Gecko)、谷歌(webkit)、 opear(Presto)

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