js高頻面試題(高頻)

題目

  1. js基本數據類型
  2. 閉包是什麼,寫一個簡單的閉包
  3. 原型和原型鏈
  4. 作用域
  5. this
  6. call、apply和bind
  7. ajax基本步驟以及readyState的五種狀態
  8. promise用過嗎?作用是什麼?它的基本步驟
  9. get和post區別
  10. 繼承有哪些方式
  11. 淺拷貝深拷貝

答案

1. js基本數據類型
基本數據類型:number,string,boolean,null,undefined,symbol
引用類型:數組、日期、正則、函數
2. 閉包是什麼,寫一個簡單的閉包
閉包指的是函數內部的函數,它有權去訪問另一個函數內部的變量,當查找一個自由變量時,在函數定義的地方查找而不是函數執行的地方



function outer(){
   
   
let n = 0;
  function inner(){
   
   
  let m = 2;
  alert(m+n);
  }
}
outer();
function print(fn){
   
   
 const a = 200;
 fn();
}
const a = 100;
function fn(){
   
   
   console.log(a);
}
print(fn);

3. 原型和原型鏈
js中有兩種原型,一種是顯式原型prototype(又稱爲函數原型,只有函數纔有),另一種叫做隱式原型_proto_(又稱爲對象原型).

  • prototype保存着實例共享的方法,有一個指針constructor會指回構造函數
  • _proto_用於指向創建這個對象的函數的prototype,假如需要獲取這個對象的屬性或方法時,先回在自身屬性或方法上查找,假如找不到就會通過_proto_向上尋找,由此形成原型鏈

4. 作用域
一個變量可以使用/生效的範圍,包括:全局作用域、函數作用域、塊級作用域。
全局作用域指的是window,函數作用域指的是函數,塊級作用域指的是有花括號的地方
5. this


  • 作爲普通函數調用 =>返回window
  • 使用call、apply、bind調用 =>傳什麼綁定什麼
  • 作爲對象方法調用=>返回對象本身
  • 在class方法中調用=>返回當前實例本身

6. call、apply和bind
改變this指向,call和apply傳參形式不一樣,call傳入一個個參數,apply傳入一個數組,bind只有在調用時纔會生效。
7. ajax基本步驟以及readyState的五種狀態

//1創建對象xmlhttprequest
const xhr = new XMLHTTPRequest();
//2創建一個http請求初始化
xhr.open('GET','/api',false);
//3send發送請求
xhr.send();
//4監聽狀態變化
xhr.onreadystatechange = function(){
   
   
 //5查看狀態碼判斷狀態
 if(xhr.readyState == 4){
   
   
   if(xhr.status >= 200 &&xhr.status <= 300){
   
   
   }
 }
}

readyState:

  • 未初始化0
  • 正在載入1
  • 載入完成2
  • 開始解析3
  • 解析完成4

8. promise用過嗎?作用是什麼?它的基本步驟
promise是用來解決回調地獄的回調問題而產生的,是進行異步編程的新的解決方案
執行步驟:

在這裏插入圖片描述基本編碼流程:

//1創建promise對象
const p = new Promise((resolve,reject)=>{
   
   
//2啓動異步任務
setTimeout(() =>{
   
   
  const time = Date.now()
//3根據處理結果做不同處理
//3.1如果成功,調用resolve(),指定成功的value
if(time % 2 ===1){
   
   
  resolve('成功的值' + time)
}else{
   
   
//3.2如果失敗,調用reject(),指定失敗的reason
  reject('失敗的值' + time)
  }
},2000)
})

//4promise指定成功或失敗的回調函數來獲取成功的value或失敗的reason
p.then(
  value =>{
   
   
   //成功的回調函數onResolved,得到成功的value
     console.log('成功的value',value);
  },
  reason =>{
   
   
  //失敗的回調函數onRejected,得到失敗的reason
      console.log('失敗的reason',reason);
  }

9. get和post區別

  1. get一般用於獲取請求,post一般用於提交請求
  2. get傾向於放在url中,post傾向於放在body體內
  3. 從根本上來說兩種請求方式都不夠安全,因爲http本身就是明文協議,所以安全的普遍做法是採用https密鑰加密協議。而由於get是放在請求體內,所以相對來說比較安全的做法是採用post+body的做法
  4. get數據的長度限制其實是指url的長度限制,但http協議本身其實對url的長度並未做任何限定,實際的限制是由客戶端/瀏覽器以及服務器限定的

10. 繼承有哪些方式
原型鏈繼承、構造函數繼承、組合繼承、原型式繼承、寄生式繼承、寄生組合繼承

11.淺拷貝深拷貝

不懂的可以看這篇
淺拷貝基本數據類型拷貝的是值,引用類型拷貝的是地址,因此當值是引用類型時,新創建的值如果發送變化,那麼指針指向的內容也就發送變化,因此原來的值也就改變。
淺拷貝方法有:

  • object.assign
  • 擴展運算符let cloneObj = {…obj}
  • concat運算符
  • slice拷貝數組
  • 手工實現

深拷貝指的是在內存中開闢一個新的空間,用來存放拷貝過來的值,新創建的值改變,不會影響到原有的值(因爲它們不屬於同一個地址)
深拷貝方法:JSON.stringfy、手寫遞歸實現

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