[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)
})
~~~