什麼是原型鏈?怎麼實現繼承?
call、apply、bind的區別?
什麼是作用域鏈?什麼是閉包?詞法作用域?
ajax和jsonp?jsonp為什麼只支援get?
基本資料型別?堆疊區別?null和undefined
js怎麼實現非同步?
eventloop?js引擎執行緒執行過程?
釋出/訂閱者和觀察者區別?
base64網路傳輸? 網路傳輸只能傳輸可列印字元
持續動畫? setTimeout、setInterval、window.requestAnimationFrame
js多正規化語言?
防抖,節流?
事件委託?
迴圈 for...in Object.keys for...of Object.getPropertyNames
模組化、元件化?
this?
類陣列?轉陣列?
判斷陣列,陣列去重?instanceof與isArray Object.prototype.toString().call([]) ?
instanceof與isArray判斷物件是否為陣列?
localStorage、cookie、sessionStorage
深拷貝、淺拷貝?
垃圾回收機制?
js元件化、模組化?
formData和原生的ajax有什麼區別?Content-type
記憶體洩漏?
in 和hasOwnProperty的區別?
https://www.cnblogs.com/ziwuge/archive/2011/09/27/2193385.html
複製程式碼
深拷貝
黑科技 JSON.parse(JSON.stringify(obj))
遞迴拷貝
Object.create(oldObj)
複製程式碼
原型鏈
每一個物件都會在內部初始化一個屬性,就是(prototype)原型。
當訪問一個物件是否存在屬性或方法時,優先在物件自身尋找該屬性,如果有
就使用自身的屬性或方法;沒有就在建立這個物件的建構函式的原型上向上查
找,以此類推找到object.prototype物件,還沒找到就返回undefined;
複製程式碼
null 和 undefined
null是一個空物件,沒有任何屬性和方法
undefined是未定義,此處應該有個值,未賦值
複製程式碼
js是多正規化語言
命令式 基本的邏輯控制、迭代語句等。
函式式 scope Chain (作用域鏈)
物件導向 Prototype Chain(原型鏈)
複製程式碼
閉包
- 可以讀取自身函式外部的變數(沿著作用域鏈尋找)
- 讓這些外部變數始終儲存在記憶體中
定時器
實際上要等到當前指令碼的所有同步任務執行完
複製程式碼
EventLoop 執行棧執行順序。
巨集任務:script整體 setTimeout setImmediate I/O UI
微任務:process.nexTick promise.then async
script(主程式程式碼)—>process.nextTick—>Promises...——> async ——> setTimeout——>setInterval——>setImmediate——> I/O——>UI rendering
複製程式碼
類陣列
見類陣列物件有arguments物件、通過Node.childNodes得到的NodeList物件、通過document.getElementsBy...得到的HTMLCollection物件、element.attributes得到的NamedNodeMap物件等。
Array.prototype.sort.call(arrLikeObj); 劫持應用陣列方法
Array.prototype.slice.call(arrLikeObj);//轉化為陣列
Array.from(arrLikeObj);//es6轉化為陣列
Object.prototype.toString().call() 判斷是否是陣列
複製程式碼
localStorage
localStorage.setItem('myCat', 'Tom');
localStorage.getItem('myCat');
localStorage.removeItem('myCat');
localStorage.clear();// 移除所有
複製程式碼
formData和原生的ajax有什麼區別
form的Content-type預設值:Content-type:application/x-www-form-urlencoded
ajax預設值Content-Type是text/plain;charset=UTF-8。
複製程式碼
jsonp為什麼只支援get
JSONP的最基本的原理是:動態新增一個<script>標籤,而script標籤的src屬性是沒有跨域的限制的。這樣說來,這種跨域方式其實與ajax XmlHttpRequest協議無關了。
可以說jsonp的方式原理上和<script src="http://跨域/...xx.js"></script>是一致的,因為他的原理實際上就是 使用js的script標籤 進行傳參,那麼必然是get方式的了,和瀏覽器中敲入一個url一樣
複製程式碼
垃圾回收原理淺析
標記清除 標記變數進入環境,離開環境。
引用計數 釋放引用次數為0的值所佔的記憶體。
複製程式碼
陣列去重
// 最簡單去重
function uniq(array){
var temp = []; //一個新的臨時陣列
for(var i = 0; i < array.length; i++){
if(temp.indexOf(array[i]) == -1){
temp.push(array[i]);
}
}
return temp;
}
var aa = [1,2,2,4,9,6,7,5,2,3,5,6,5];
console.log(uniq(aa));
// 排序相鄰去重
/*
* 給傳入陣列排序,排序後相同值相鄰,
* 然後遍歷時,新陣列只加入不與前一值重複的值。
* 會打亂原來陣列的順序
* */
function uniq(array){
array.sort();
var temp=[array[0]];
for(var i = 1; i < array.length; i++){
if( array[i] !== temp[temp.length-1]){
temp.push(array[i]);
}
}
return temp;
}
var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
console.log(uniq(aa));
// set去重
function dedupe(array){
return Array.from(new Set(array));
}
dedupe([1,1,2,3]) //[1,2,3]
複製程式碼
ajax
過程:
(1)建立一個非同步呼叫物件XMLHttpRequest物件.var xhr=new XMLHttpRequest();0
(2)建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證資訊;1
(3)設定響應HTTP請求狀態變化的函式.xhr.open('post','1.txt',true);2
(4)傳送HTTP請求. xhr.send();3
(5)獲取非同步呼叫返回的資料。4
複製程式碼
xhr.onreadystatechange=function(){
if (xhr.readyState==4) {
if (xhr.status==200) {
alert(xhr.responseText);
}else{
alert("出錯了:"+xhr.status);
}
};
}
readyState 屬性表示Ajax請求的當前狀態。它的值用數字代表。
0 代表未初始化。 還沒有呼叫 open 方法
1 代表正在載入。 open 方法已被呼叫,但 send 方法還沒有被呼叫
2 代表已載入完畢。send 已被呼叫。請求已經開始
3 代表互動中。伺服器正在傳送響應
4 代表完成。響應傳送完畢
複製程式碼
this
//this物件是在執行時基於函式的執行環境繫結的:在全域性函式中,this等於window,而當函式被作為某個物件呼叫時,this等於那個物件。不過,匿名函式具有全域性性,因此this物件同常指向window;
var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    return function(){
      return this.name;
     };
   }
};
alert(object.getNameFunc()());
複製程式碼
型別轉換
物件在轉換型別的時候,會呼叫內建的 [[ToPrimitive]] 函式,對於該函式來說,演算法邏輯一般來說如下:
- 如果已經是原始型別了,那就不需要轉換了
- 呼叫 x.valueOf(),如果轉換為基礎型別,就返回轉換的值
- 呼叫 x.toString(),如果轉換為基礎型別,就返回轉換的值
- 如果都沒有返回原始型別,就會報錯
模組化
優點
- 解決命名衝突
- 提供複用性
- 提高程式碼可維護性
手段:
- 立即執行函式
- AMD CMD
- CommonJS
- ES Moudle
new 實現
function create() {
let obj = {}
let Con = [].shift.call(arguments)
obj.__proto__ = Con.prototype
let result = Con.apply(obj, arguments)
return result instanceof Object ? result : obj
}
複製程式碼