JavaScript面試基礎
1.何時使用==和===
if(obj.a == null) {} 只有此時用==,其他時候用===,這是JQuery原始碼中推薦使用的寫法
2.JS中按照儲存方式分為:值型別,引用型別
值型別:賦值時不會互相干擾
引用型別:指標型別,會互相干擾,它不是值的拷貝
3.理解JSON
JSON是一個JS物件,也是一種資料格式
JSON.stringify({a:10,b:4}) 轉換成字串
JSON.parse('{"a":10,"b":4}') 轉換成JSON物件
4.原型與原型鏈
用instanceof來判斷一個函式是否是一個變數的建構函式
5條原型規則:
★所有引用型別(陣列,物件,函式),都具有物件的特性,即:
可自由擴充套件屬性(除了null外)
★所有引用型別(陣列,物件,函式),都有一個__proto__屬性(隱式原型),屬性值是一個普通的物件
★所有函式,都有一個prototype屬性(顯式原型),屬性值是一個普通的物件
★所有引用型別(陣列,物件,函式),__proto__屬性值指向它的建構函式的prototype屬性值
★當試圖得到一個物件的某個屬性值時,如果這個物件本身沒有這個屬性,那麼它會去它的__proto__(即它的建構函式的prototype)中尋找
問題:
如何準確判斷一個變數是陣列型別:
描述new一個物件的過程:
建立一個新物件,this指向這個新物件,執行程式碼(即對this賦值),隱式返回this
zeopto(或其他框架)原始碼中如何使用原型鏈
5.閉包使用場景
函式作為返回值
函式作為引數傳遞
作用域:自由變數,作用域鏈(自由變數的查詢),閉包的使用場景
閉包主要用於封裝變數,收斂許可權
6.this
作為建構函式執行
作為物件屬性執行
作為函式執行
7.非同步和單執行緒
使用非同步的場景:定時任務:setTimeout,setInterval;網路請求:ajax,動態img載入;事件繫結(都需要等待,等待過程不能阻塞)
同步與非同步的區別:同步會阻塞程式碼的執行,非同步不會(alert是同步執行)
8.其他
獲取2017-06-10的日期
獲取隨機數,要求長度一致的字串格式
(Math.random在前端中主要是為了清除快取)
寫一個能遍歷物件和陣列的通用forEach函式(陣列API(foeEach,every,some,filter,sort))
9.JS-Web-API
DOM本質:瀏覽器把拿到的html程式碼,結構化一個瀏覽器能識別並且js可操作的一個模型
attribute:html標籤的屬性
property:js物件標準屬性
DOM的基本資料結構:樹
10.BOM
如何檢測瀏覽器的型別
navigator.userAgent從這個字串裡來分析
拆解url的各部分
location.protocol返回協議
location.host返回主機
location.pathname
location.search
11.事件
通用事件繫結:
事件冒泡
DOM樹形結構,事件冒泡
e.stopPropatation()阻止冒泡
代理:程式碼簡潔,減少瀏覽器記憶體佔用
12.ajax
同源策略:不允許ajax訪問其他域的介面
可以跨域載入資源的三個標籤:
<img src=xxx> 用於打點統計
<link href=xx> <script> 可以使用CDN
<script src=xx> 可以使用JSONP
所有跨域請求都必須經過資訊提供方允許
JSONP實現原理:
在<script>標籤中定義window.callback函式,外域執行後返回的也正好是callback函式
也可以在伺服器端設定http header:
13.儲存
cookie,sessionStorage,localStorage的區別
cookie:本身用於客戶端與服務端通訊,但是它有本地儲存的功能,於是就被“借用”,使用document.cookie=...獲取和修改
cookie缺點:儲存量太小,所有http請求都帶著,會影響獲取資源的效率,API簡單,需要封裝才能用document.cookie=..
localStorage: API簡答易用
localStorage.setItem(key,value),localStorage.getItem(key)
sessionStorage:會話關閉後就會被清理
14.AMD
Require.js
全域性define函式
全域性require函式
依賴JS,會自動非同步載入
15.commJS
Commons不會非同步載入JS,而是同步一次性載入
AMD和commonJS使用場景:
要非同步載入用AMD,用NPM一般就用commonJS