題目
- js基本數據類型
- 閉包是什麼,寫一個簡單的閉包
- 原型和原型鏈
- 作用域
- this
- call、apply和bind
- ajax基本步驟以及readyState的五種狀態
- promise用過嗎?作用是什麼?它的基本步驟
- get和post區別
- 繼承有哪些方式
- 淺拷貝深拷貝
答案
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區別
- get一般用於獲取請求,post一般用於提交請求
- get傾向於放在url中,post傾向於放在body體內
- 從根本上來說兩種請求方式都不夠安全,因爲http本身就是明文協議,所以安全的普遍做法是採用https密鑰加密協議。而由於get是放在請求體內,所以相對來說比較安全的做法是採用post+body的做法
- get數據的長度限制其實是指url的長度限制,但http協議本身其實對url的長度並未做任何限定,實際的限制是由客戶端/瀏覽器以及服務器限定的
10. 繼承有哪些方式
原型鏈繼承、構造函數繼承、組合繼承、原型式繼承、寄生式繼承、寄生組合繼承
11.淺拷貝深拷貝
不懂的可以看這篇
淺拷貝基本數據類型拷貝的是值,引用類型拷貝的是地址,因此當值是引用類型時,新創建的值如果發送變化,那麼指針指向的內容也就發送變化,因此原來的值也就改變。
淺拷貝方法有:
- object.assign
- 擴展運算符let cloneObj = {…obj}
- concat運算符
- slice拷貝數組
- 手工實現
深拷貝指的是在內存中開闢一個新的空間,用來存放拷貝過來的值,新創建的值改變,不會影響到原有的值(因爲它們不屬於同一個地址)
深拷貝方法:JSON.stringfy、手寫遞歸實現