[toc]
# 題1、什么是閉包?
答:在一個函數中返回一個函數就會形成一個閉包。
在閉包的外層函數中定義的變量會被這個閉包保護起來,所以其實我們使用閉包其實就是為了得到一個 `能夠被保護起來的全局變量` 。
閉包中這個變量的特點:1. 受保護(只要被閉包中的代碼修改) 2. 長駐內存(不會像普通的局部變量一樣,用完就銷毀了)
所以閉包變量即有全局變量的優點(隨處可用并且長駐內存)又有局部變量的優點(只能在函數內使用)
應用場景:
1. 維護一個全局的自增 ID(如果使用全局變量,有可能會出現被誤操作,而使用了閉包,就可以確保ID不會被外部誤操作,而且只能進行+1操作)
2. 緩存一些數據也可以使用閉包(比使用全局變量好,可以避免被誤操作)
~~~
// 自增 id 的閉包(好處1. 不會被閉包修改 好處2:只能進行+1操作)
function id(){
let id = 1 // 閉包變量
return function() {
return id++
}
}
// 當我們需要 ID 時就使用閉包
let id= id()
console.log( id() ) // 1
console.log( id()) // 2
console.log( id()) // 3
~~~
# 題2、eval 是干什么用的?
答:是 JS 中的一個函數,用途:把一個字符串當做 JS 代碼來執行。
~~~
const str = "var age = 100;"
// 把 str 字符串解析成 JS 代碼并執行
eval(str) // 相當于執行了 var age = 100 這行代碼
console.log( age ) // 100
~~~
# 題3、正則表達式中的 g 代表什么?
答:g:全局匹配:匹配所有滿足條件的字符。
~~~
let a = 'a3232fafda32'
a.replace(/\d/, '*') // a*232fafda32
a.replace(/\d/g, '*') // a****fafda** (全局匹配)
~~~
# 題4、HTTP 請求有哪些?用過哪些?
HTTP協議中規定在請求一個資源(網頁、圖片、音樂、JS、CSS等)時,使用的請求方法:共8種:
GET:獲取數據。
POST:新增。
DELETE:刪除。
PUT:修改
....
示例:
~~~
// 規范(不是強制)的用法:比如:http://api.abc.com/users
GET http://api.abc.com/users?page=1&pagesize=20 :獲取用戶信息(參數在URL后)
POST http://api.abc.com/users:添加一個用戶,(數據在 body 中傳遞)
DELETE http://api.abc.com/users?id=1:刪除一個用戶(參數在URL后臺)
PUT http://api.abc.com/users?id=2 :修改一個用戶(參數在URGL和BODY中傳,URL中傳ID,body 中保存數據)
~~~
# 題5、HTTP常用的狀態碼?
2XX 成功: 200(成功) 201(創建成功)
3XX 重定向: 301(永久重定向) 302(臨時重定向)
4XX 客戶端錯誤 :400(請求時參數錯誤) 401(未登錄) 403(無權限-超級管理員-會計等) 404(服務器上沒有這個資源)
5XX 服務器錯誤 : 500(服務器錯誤-后臺代碼出錯)
# 題6、實戰?
有一個數組,數組a中有100個元素,數組b中有10個元素,數組b中保存的是a中的10個元素
的下標,現在要從A中把b中這10個下標刪除掉怎么寫?
注意點:當從a中刪除一個元素之后,后面元素的下標就變了。
答:因為刪除一個元素時,后面的元素會向前移,導致下標改變,所以我們應該從后向前刪除,具體做是先將B數組倒序(大的在前)(所以在刪除時先刪除大(從后開始刪除)的)排列然后再循環調用a數組的 splice方法 刪除。
~~~
var a = [1,2,3,32,5,34,3.....]
var b = [3,7,2,4,9,56,43,23,12,32]
b.sort((a,b)=>b-a)
b.forEach(v=>{
a.splice(v, 1)
})
~~~