俺先把目记录下来。后面有时间了来补充回答哈!
前期
1. 自我介绍
有分享自己有做up主分享前端知识的经历,问我有多少个粉丝,哈哈。
2. 为什么学习前端?为什么专业是电子商务,不走管理类?课程是不是没有计算机类的课程
提到了专业有管理和技术两个方向,我选择了技术,是因为感兴趣。
3. 你在xxx公司实习过,当时是主要做什么工作的呢?提到做二次开发,前端后端联调。(追问,具体是怎么做前后端联调的呢)
描述了,比如select新增字段,那么要和后端敲定字段名是什么,接口地址,传参方式是否发生改变。
4. 你的简历写了两个项目,是自己练手的项目嘛?
PS:我非常蠢的自爆家门,说项目是跟着视频敲的,为啥要跟面试官强调这一点呢,太笨了。
5. 项目开发的流程,描述一下?
首先是,知道要开发什么类型的项目。
其次是,知道项目要用到哪些技术栈,哪些包
如何做状态管理,如果做路由管理,还有请求的设计
再者是要设计哪些模块,最后再是开发
6. 你的项目里面写到了,图片懒加载,具体是如何实现的呢?两种方案
- 一种方案是,获取指定dom的所有图片,然后遍历,监听window的srcoll事件,一触发就获取图片的距离顶部的距离,如果小于window.innerHeight,就把值传递给img的src属性。还有一点,就是这种方式,刚开始图片的链接是存给img的data-src,就是自定义属性的,这样图片是不会显示。
const images = document.querySelectorAll('img')
// 获取显示屏的高度
window.addEventListener('scroll', function() {
images.forEach(img => {
const imgTop = img.getBoundingClientRect().top // 获取的是
if (imgTop < window.innerHeight) {
img.src = img.getAttribute('data-src')
}
})
})
- 还有一种方案,就是使用Intersection的API,这个API,能够解构出一个isIntersecting, 如果是true,就给图片的src属性赋值。在Vue当中一般封装成自定义指令。这个方案和上面的方案的区别是:上面的window.scroll,他会一直监听,即便图片已经进入了可视区了。但是IntersectionObserver的API,我们能够observer.unobserve(el),一旦赋值,就停止监听了,性能会有提升。
const directives = (app) => {
app.directive('lazyload', {
mounted (el, binding) {
// 创建observer对象
const observer = new IntersectionObserver(([{ isIntersecting }]) => {
// 解构出 isIntersecting参数 如果是true -》表示在可视范围
if (isIntersecting) {
// 停止监听dom
observer.unobserve(el)
// 给el 也就是绑定这个属性的dom 添加 onerror这个事件 然后给他的src属性添加图片
el.onerror = function () {
el.src = defaultImage
}
// 给el的src赋值 binding.value就是 v-lazyload=""绑定的值
el.src = binding.value
}
})
observer.observe(el)
}
})
}
7. 你的项目用到了,promise.all的方法,这个方法的在项目中的使用场景是什么样的呢?
promise.all这个方法如果有一个是false,那么最终的结果是什么呢?
7. 你的移动端项目是怎么做移动适配的?
这里很忘记了,就说忘记了,答得不好
7. 你的项目中用到keep-alive和sessionStorage,讲讲场景?localStorage和sessionStorage的区别是什么?
8. 开始问基础,你知道http缓存是什么不?
描述了协商缓存和强缓存的机制
9. vue2为什么要向vue3过渡?
- 提到了vue2和vue3的响应式的实现,vue2的响应式,存在数组无法处理,set和map不支持,一上来就就会监听对象的所有属性等缺点。
- 追问,数组无法处理,arr[0]能不能够检测, 我不能因为Object.defineProperty()无法劫持到索引访问的变化。
- 追问,那么后来是怎么解决这个问题的?面试官有提示,用了什么API,讲了Vue.$set()
10.你对diff算法和虚拟dom是了解还是比较熟悉?
- 我讲了了解,说看过snabbdom源码,然后他就直接跳过了,哈哈哈!
- 虚拟dom是什么
- diff算法是什么
- key的作用是什么。这三个问题都是大头
11. 你知道vue当中的this,为什么能够通过this访问方法和变量呢?
- 我说了自己可能不太了解,描述了Vue内部进行了封装,通过.call/.apply/.bind不确定是哪一个。
- 说React里面就是没有进行处理,类组件里面要用bind进行改this
12. 你的项目封装了轮播图组件,那么具体是怎么封装的呢?
13. 有没有碰到什么困难,项目中?
- 讲了轮播图组件的bug,鼠标停在轮播图中,然后刷新页面,鼠标刚开始还在轮播图里面,但是这个时候,轮播图还是依然自动播放的,按理来说是停止自动播放,表明自己请教过一些前辈,但是仍旧没能够解决。明确的讲到了一个碰到的,但是没有解决的问题,也有去努力查文章和请教别人。面试官也给出了建议
14. 如果后端返回一段数据,我如何在Mounted里面请求到这个数据,并获取到最新的dom,去更新?
- 说实话有点没听懂,讲了用nextTick就能够解决
15. 知道vue中的组件通信?
思路:父子、兄弟、爷孙、没有任何关系
- 讲了props,emit和自定义事件,
- 讲了eventBus并在vue3中被废除,
- 面试官提示,vue3中的一些,讲了project和inject
- vuex
- vue2中,用$attrs和$listeners,可以父亲组件给孙子组件传递数据,孙子组件可以给父亲组件this.$emit(),适合爷孙传值。但是$listeners在vue3中被废弃了。
16. 行内元素和块级元素的区别?
- 块级独占一行,行内不是
- 块级可以设置宽高,行内不行,宽高就是元素的宽度,如果要修改,必须通过display转化为行内块或者块级。其实定位和浮动也可以
- 行内元素设置行高ok,等同于和块级元素设置行高。意思是,比如div > span, 假设给span设置line-height,那么等同于给块级元素设置行高
- 面试官提示margin和padding,我说了行内的上下不能设置,但是左右的margin和padding都是有效果的。
- 块级元素中可以放块级元素,也可以放行内元素。行内元素里面不应该放块级元素
- 行内元素,设置浮动后,这个元素是块级元素嘛?应该是行内块元素,可以设置宽高,不占一行。
17. async修饰的函数,返回的是什么
讲了还是promise对象
18. [] == []相等吗?
- 不太确定,说是不相等,因为内存地址的空间不是同一块空间
- []===[]呢?我说也不相等。小结:两个等于会进行隐式转换,但是数组因为比较的还是内存地址,所以两个数组的比较和三个数组的比较没啥区别
- 0 == false呢?说相等,三个等于是不相等的
19. 定位,relative和absolute的区别是什么?
讲了定位的依据,前者是自身的顶点。后者是父亲,设置了relative的父亲
20. 反问:
1. 对于自身的表现的建议,不足。说了项目不能不熟悉,一定要很熟悉
2. 贵公司的前端规模
3. 公司是产品长期维护还是项目型的
4. 问了一个具体的技术问题
5. 多久出结果,回答说3天内,要跟hr协商。
#前端##前端面经##你的秋招进展怎么样了#