面试是一种对自己知识漏洞的查漏补缺。
记录一下自己面试中表现不佳的问题
1:如果在保证3个接口全部返回成功后,执行相应的函数?
我首先想到是是使用promise.all和axios库的all方法支持 另外还有async加await
如
代码语言:javascript复制let urls = [
'https://jsonplaceholder.typicode.com/posts/1',
'https://jsonplaceholder.typicode.com/posts/2',
'https://jsonplaceholder.typicode.com/posts/3'
]
let axiosList = []
urls.forEach(url => {
axiosList.push(axios.get(url))
})
axios.all(axiosList).then(function (res) {
let p1 = (res[0].data)
let p2 = (res[1].data)
console.info(p1)
console.info(p2)
})
代码语言:javascript复制var p1 = new Promise(function (resolve, reject) {
setTimeout(resolve, 500, 'P1');
});
var p2 = new Promise(function (resolve, reject) {
setTimeout(resolve, 600, 'P2');
});
// 同时执行p1和p2,并在它们都完成后执行then:
Promise.all([p1, p2]).then(function (results) {
console.log(results); // 获得一个Array: ['P1', 'P2']
});
2:如何在vuex中a模块使用b模块的actions ?
3:http的复杂请求和简单请求,如何避免或优化option请求?
跨域请求分为两种:简单请求和复杂请求
符合以下任一一种情况的就为复杂请求:
1.使用方法put/delete/patch/post;
2.使用json格式的数据(content-type: application/json)
3.请求中带有自定义头部
其他情况都为简单请求
option请求出现的情况有两种
1:获取后台服务器支持的HTTP的通信方式
2:对跨域请求进行preflight request (预检请求)
预检请求首先需要向另外一个域名的资源发送一个Http Options的请求头,以检查实际发送的请求是否是安全的,options请求是浏览器自发起的preflight request(预检请求)
preflight request 请求报文中有两个需要关注的header字段
(1): Access-Control-Request-Method: 告知服务器实际请求所使用的HTTP方法
(2): Access-Control-Request-Headers: 告知服务器实际请求所携带的自定义Header字段
同时服务器也会添加origin header,告知服务器实际请求的客户端的地址。服务器基于从预检请求获得的信息来判断,是否接受接下来的实际请求。
服务器所返回的Access-Control-Allow-Methods首部字段将所有允许的请求方法告知客户端,返回将所有Access-Control-Request-Headers首部字段将所有允许的自定义首部字段告知客户端。此外,服务器端可返回Access-Control-Max-Age首部字段,允许浏览器在指定时间内,无需再发送预检请求,直接用本次结果即可。
如要优化Option的请求,可以在服务器端设置返回的Access-Control-Max-Age 为最大值, 指定一定时间内,此接口不需要在发送Options请求
4:js为什么会有变量提升?
js的诞生是为了解决客户端人机交互的问题,是一种弱类型的语言,在如果js设计的如java那样严谨,必须要先声明在使用,就会导致客户端代码很多错误,非常影响用户体验
此外,
javascript并不是严格的自上而下执行的语言。
它会将当前作用域的所有变量的声明提升到程序的顶部。
js和其他语言一样,都要经历编译和执行阶段。而js在编译阶段的时候,会搜集所有的变量声明并且提前声明变量,而其他的语句都不会改变他们的顺序,因此,在编译阶段的时候,变量已经声明,第二步就是赋值了
- js会将变量的声明提升到js顶部执行,因此对于这种语句:var a = 2;其实上js会将其分为var a;和a = 2;两部分,并且将var a这一步提升到顶部执行。
- 变量提升的本质其实是由于js引擎在编译的时候,就将所有的变量声明了,因此在执行的时候,所有的变量都已经完成声明。
- 当有多个同名变量声明的时候,函数声明会覆盖其他的声明。如果有多个函数声明,则是由最后的一个函数声明覆盖之前所有的声明。
5:如何在nodejs中使用多线程的?
使用 cluster模块 worker_threads模块
worker_threads模块
cluster模块
6:移动端的布局方案有哪些?
百分比
rem
媒体查询
px2rem 库
前端常见的布局方案大全
7:vue-router的底层原理是怎样的
使用Html5的pushState 与hashChange事件的监听来实现根据url匹配对应的页面资源