本系列主要整理博主2023秋招的面试情况。本节介绍20220713兴业数金前端一面。
答:首先因为vue是当前前端较为流行的框架,使用vue的公司较多,也证明了这是一个非常成功的框架;第二是因为这个框架是国人编写的,简单易学,上手较快;第三因为这个框架使用了双向数据绑定,数据和视图的交互更加方便;最后因为它含有组件化、视图数据结构分离、虚拟DOM、运行速度快等特点。
答:双向数据绑定就是当我们采用MV模式时,就是模型-视图模式时,通常,我们需要编写代码,将从服务器获取的数据进行“渲染”,展现到视图上。每当数据有变更时,我们会再次进行渲染,从而更新视图,使得视图与数据保持一致。而另一方面,页面也会通过用户的交互,产生状态、数据的变化,这个时候,我们则编写代码,将视图对数据的更新同步到数据,以致于同步到后台服务器。而单向数据绑定只有模型----->视图的一个方向的数据传递。
双向数据绑定的优缺点:
①优点:用户在视图上的修改会自动同步到数据模型中去,数据模型中值的变化也会立刻同步到视图中去;无需进行和单向数据绑定的那些相关操作,会简化大量业务无关的代码。
②缺点:增加了出错时的debug的难度、消耗较大,部署很大网站的时候会出现问题。
答:可以打开开发者模式,会有相应的报错,比如props不存在、期待一个Object你传入了一个Array之类的,可以直接从报错中找到。
答:webpack。
①绝对定位+margin:auto ②绝对定位+margin负值 ③绝对定位+translate
(1)dispaly:none 消失+重排+重绘+绑定事件不触发+无过渡;
(2)visibility:hidden 存在+不重排+重绘+绑定事件不触发+有过渡;
(3)opacity:0 存在+不重排+不一定重绘+触发自身绑定+有过渡;
(4)position:absolute 移除视线;
(5)z-index:负值 使用其他元素遮盖;
(6)transform:scale(0,0) 缩放元素为0 存在+绑定事件不触发。
let p1 = new Promise(function(){})
let p2 = p1.then((resolve,reject)=>{})
如果p1的状态的pending,那么p2的状态也是pending;
如果p1的状态的resolved,then会执行resolve,那么p2的状态由resolve的返回值决定;
如果p1的状态是rejected,then会去执行reject(),那么p2的状态由reject()的返回值决定。
//test1.js
import axios from 'axios'
export function get({url,params = {}}) {
return new Promise((resolve,reject) => {
axios.get(url,{
params:params
}).then( response =>{
landing(url, params, response.data);
resolve(response.data);
}).catch(error =>{
reject(error)
})
})
}
//test2.js
import { get } from '../utils/http';
//import { get as http } from '../utils/http';
//test1.js
export default function HttpData (fecth,url, parm) {
let _data = "";
return new Promise((resolve, reject) => {
switch (fecth){
case "get":
get(url, parm).then(function (response) {
resolve (response);
}).catch(function (error) {
console.log("get request failed.",error);
});
break;
case "post":
post(url, parm).then(function (response) {
resolve (response);
}).catch(function (error) {});
break;
default:
break;
}
});
}
//test2.js
import http from '../utils/http';
答:由于不同用户登录以后应该有不同的权限,可以看到不同的内容,因此需要给不同的用户在菜单上分配不同的权限。菜单权限最重要的一点就是:**当获取用户信息的时候,服务器会把响应的用户拥有菜单的权限信息返回,需要根据用户身份对比出,当前这个用户需要展示哪些菜单。**本项目中,服务器会返回给用户拥有的菜单权限信息,在vuex中可以获取到,然后通过提取路由、对比路由、重组路由就可以得到当前用户用户的异步路由+常量路由,进一步修改路由的渲染数组,就能最终展示出菜单权限。
答:服务器下发的token,是用户唯一的标识符,token不应该存在vuex中,因为如果存在vuex中,刷新页面token就会消失,因此要把token放在本地存储中,这样在导航守卫的过程中就可以获取token,进而判断是否还能点击登录页面。
Promise.all可以将多个Promise实例包装成一个新的Promise实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值。Promise.race()将里面返回最快的结果返回,不管结果本身是成功状态还是失败状态。当要做一件事,超过多长时间就不做了,可以用这个方法来解决:
Promise.race([promise1,timeOutPromise(5000)]).then(res=>{})
答:JS是一门单线程语言,JS实现单线程非阻塞的方法就是事件循环。JS把任务分为同步任务和异步,当执行遇到同步任务时,则立即执行,如果遇到异步任务,则挂起任务,异步任务也分为宏任务和微任务,微任务比如Promise.then、nextTick、await/async、MutonObserver、Object.observe,微任务要在主函数执行结束、当前宏任务结束之前执行,而宏任务包括执行script标签内部代码、setTimeout/setInterval、ajax请求、postMessageMessageChannel、setImmediate,I/O。
答:深拷贝和浅拷贝是针对引用数据类型来说的。浅拷贝就是只拷贝一层,深层次的引用类型则共享内存地址。通过浅拷贝得到的引用数据,如果修改第一层的数据,那么新数据改变不会影响原数据;如果修改第二层的引用类型数据,则新旧数据会一起改变。存在浅拷贝现象的有:①Object.assign ;②Array.prototype.slice()、Array.prototype.concat();③使用拓展运算符实现的复制。
深拷贝开辟一个新的栈,两个对象属完成相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。常见的深拷贝方式有:①_.cloneDeep()、②jQuery.extend()、JSON.stringify()、手写循环递归。