出现问题
1.自我介绍过于简短
2.简历是图片合成的pdf,面试官想点项目链接查看项目,点不开,只能扫二维码查看。
面试题
css
1.说一下css掌握的程度
2.说一下sass
3.说一下你项目中用到的styled-components
4.css布局具体说一下
5.align-content和align-items有什么区别(flex布局)
答:align-items 和 align-content的区别
虽然两者都表示设置子元素在侧轴上的排列方式,但:
align-items 应用于子元素没有换行(父元素代码中没有flex-wrap:wrap;)的情况下
align-content 应用于子元素出现换行的(父元素代码中有flex-wrap:wrap;)的情况下
总结:单行(列)找align-items,多行(列)找align-content
6.canvas用过吗?
7.一般是怎么做兼容性布局
答:flex布局,flex:1.
8.如果一个页面有很多图片,加载的很慢,应该怎么优化
9.骨架屏你做过吗?原理是什么样的?
10.水平居中了解过的方式有多少种。
js
1.说一下事件委托机制的过程
事件委托:把子级的事件委托给父级来处理,比如平时要删除元素,添加元素,如果每一个元素都绑定事件的话效率性能可能会很低。为了提高性能我们需要使用事件委托。这样就能删除任意在同一父级下的子节点了。
e.target是访问最小的事件
2.事件流分多少个阶段,分别是做什么的
js事件模型正确的顺序是,事件捕获-》事件处理-》事件冒泡
3.js常见的内存泄露有哪些,分别是怎么处理的
4.对浏览器本地存储了解吗,这些存储的区别是什么?具体展开说一下。
5.说一下对原型/原型链的理解
6.是不是每个对象都有prototype,什么样的对象才会有prototype
7.说一下new这个操作符具体做了什么,过程是什么
7.1 创建了一个空对象;
7.2将空对象的原型指向构造函数的原型
7.3将空对象作为构造函数的上下文(改变this指向)
7.4对构造函数有返回值的处理和判断,如果是返回基本数据类型,那new就会忽略,如果是引用数据类型,那么new就不生效。
自己实现一个new
8.说一下call()/apply()/bind()的区别和相同点
9.关于this指向的题
a = 1;
function foo() {
console.log(this.a);
}
const obj = {
a: 10,
bar() {
foo();
}
}
obj.bar(); // 1
这里虽然obj.bar(),但是只是执行了bar()里面的foo()并没有任何人调用foo(),所以还是指向window。
10.你对ES6了解有多少,说一下
11.promise和async/await还有setTimeout他们之间有什么区别
12.promise有什么缺点和优化方法
13.说一下浏览器的事件循环机制
JavaScript 是一门单线程的语言,它的异步和多线程的实现是通过 Event Loop 事件循环机制来实现的,大体由三个部分组成,调用栈(call stack)、消息队列(Message Queue)、微任务队列(Microtask Queue)
Event Loop 开始时会从全局代码一行一行执行,遇到函数调用会把它压入调用栈中,被压入的函数叫做帧(Frame),当函数返回后会从调用栈中弹出并执行。
JavaScript中的异步操作,例如fetch、事件回调、setTimeout、setInterval中的回调函数,会入队到消息队列中称为消息(宏任务)。消息会在调用栈清空的时候被压入调用栈执行。
使用promise、async、await创建的异步操作,可以加入到微任务队列,调用栈为空,所以执行微任务队列中的任务,把他们压入调用栈并执行,最后压入消息队列中的任消息并执行,先同步再异步,先执行微任务再执行宏任务。
14.说一下闭包,
15.下面这段代码的执行结果是多少
function fn(){
var arrFn = []
for(var i = 0;i<5;i++){
arrFn[i]=function(){
return i
}
}
return arrFn
}
var box = fn()
for (var j = 0; j < box.length; j++) {
console.log(box[j]())
}
vue
1.vue中的data为什么是一个函数
2.dom渲染是在那个生命周期完成的
3.说一下v-for中key的作用
4.diff算法的原理是什么(代码大概是怎么实现的)
4.1用vnode来描述一个dom结构:虚拟节点就是用一个对象来描写真实的dom元素
判断孩子是不是一个对象,如果是对象的话说明ta会再次调用_c这个方法,如下图中的p。如果不是对象,就会调用一个叫vnode的方法,通过这个方法把它转成一个对象。
会将template ast树=>codegen(代码生成)=>转化成render函数 =>内部调用方法就是_c方法,最终的结论就是我们将模板转成虚拟dom(template => 虚拟dom)。虚拟dom一变会触发对应的watcher重新渲染
4.2diff算法的时间复杂度:问diff算法的时间复杂度,就是问vue中的diff做了那些优化,一般vue中都是同级比较,所以是O(n)
4.3简述vue中diff算法原理
- 先同级比较,再比较子节点
- 先判断一方有儿子,一方没儿子的情况,如果新的有儿子,旧的没儿子,就把新的全部插到老的节点里。如果老的节点有新的节点没有,那就直接把老的节点删掉就可以了。
- 比较两个都有儿子的情况。
- 递归比较子节点。