楼主最近在面试,作为一个前端菜鸟面了十来家公司,大概有十几天的时间。下面就面试当中的一些技术点做一个回顾和整理,供大家交流和参考。
vue
中MVVM
的实现原理 答:由于我读过vue
的源码,所以可以清楚的说明这其中的原理。这道题也是被问到最多的一道题。可以参考:剖析Vue实现原理 - 如何实现双向绑定mvvmObject.defineProperty
方法有什么作用?有哪些参数?可以通过描述对象来设置哪些特性? 答:Object.defineProperty
方法可以给一个对象设置相关的属性,这个方法一共有三个参数,第一个参数是目标对象,第二个参数是属性名,第三个参数可以是一个描述对象。描述对象一个有如下特性:value
-- 设置属性值、configurable
-- 表示是否可删除属性,能否修改属性的特性、writable
-- 是否是只读属性、enumerable
-- 是否是可枚举属性、get
-- 读取属性时调用的函数、set
-- 设置属性时调用的函数。for in
可以遍历原型链上的属性吗?可以遍历不可枚举属性吗?Object.keys
可以遍历到不可枚举属性吗?怎么遍历到对象的不可枚举属性? 答:for in
可以遍历到原型链上的属性,但是遍历不到不可枚举属性。Object.keys
不能遍历到原型链上的属性也不能遍历到不可枚举属性。可以通过Object.getOwnPropertyNames()
方法访问到不可枚举属性(这一问没有回答出来)。react
中的事件跟js
原生的事件有什么区别? 答:react
中的事件是合成事件,通过事件冒泡的原理绑定在根元素上。普通的事件时绑定在目标元素上。- 事件捕获和事件冒泡机制。 答:在一个有层次的多个元素之间,事件会先经过捕获阶段,捕获阶段是从最顶层元素一直到目标元素。当捕获阶段结束之后事件会从目标元素向底层元素进行传递也就是冒泡阶段。具体细节可以参考《javascript 高级程序设计》的第十三章事件流。
- 说一下对
Promise
的理解。Promise
有哪些常用的静态方法?Promise.all()
方法的作用是什么?可以传入哪些类型的参数? 答:Promise
是一个构造函数,实例化的过程中可以传入一个函数,这个函数有两个参数。在函数内部可以通过resolve
、reject
来修改Promise
的状态,状态发生变化后会在当前事件队列的末尾去执行then
或者catch
里面的方法。常用的静态方法有Promise.all
、Promise.race
、Promise.resolve
、Promise.reject
等。Promise.all
方法可以传入一个数组,数组中的每一项都是一个Promise
实例,只有数组中所有的Promise
的状态都是成功时才会去改变Promise.all
方法对应的Promise
状态。Promise.all
方法除了可以传入数组还可以传入所有具有iterator
的对象。具体可以参考阮老师的es6入门Promise。 - 正则表达式有哪些常用的符号?
- 列举常用的数组方法,哪些方法会改变原数组?
for of
可以遍历哪些数据类型? 答:可以遍历具有iterator
接口的对象。可以参考阮老师的es6入门Iterator 和 for...of 循环- CSS中
overflow
有哪些属性值?分别是什么作用?默认值是什么? webpack
中有哪些常用的loader
?css-loader
与style-loader
的作用分别是什么? 答:常用的有css-loader
、babel-loader
、vue-loader
、style-loader
、url-loader
等。css-loader
是用来解析css文件的,因为webpack
会将所有的东西都当成是模块,但是没有办法去解析css文件以及分析css文件中的依赖项所以需要css-loader
去进行分析。style-loader
会将通过css-loader
编译好的模块提取出来通过style
标签的形式插入到html文件中。webpack
中有哪些常用的plugin
?怎么做代码分割? 答:由于我用的webpack3.x
的版本,所以回答的也是该版本中一些常用的plugin
。常用的有htmlWebpackPlugin
、extractTextPlugin
、commonChunkPlugin
等。- 简要描述js的事件循环。 答:可以参考事件循环
- 简要描述浏览器的渲染原理。 答:我就简单说了说浏览器的渲染过程和一些概念:DOM树、CSSOM树、render、paint。可以参考你真的了解回流和重绘吗?
- 浏览器发起请求的整个过程。 答:这是一道老生常谈的题了,从DNS解析到三次握手到发送请求报文到服务端响应
- 常用的http请求头和响应头。与缓存相关的有哪些?
http1.0
与http1.1
中关于缓存有些什么区别? 答:可以参考彻底弄懂HTTP缓存机制及原理 - 常用的http响应状态码。分别表示什么意思?
- 谈谈对
websocket
的理解。有哪些替代方案? 答:我对webscoket
的理解比较有限,只知道是用来做全双工通讯的,是一个持久连接。建立连接的过程其实是通过http协议进行的,连接完成之后通过upgrade字段进行了协议升级,修改为websocket
协议,该协议的请求头数据量比较少。当时回答的替代方案是ajax
轮询和服务端推送,具体的推送方案不清楚。后来查了一些资料做了一点了解。可以参考《图解HTTP》这本书和《JavaScript高级程序设计》的第二十一章,里面提到了comet
、SSE
两种方案。 TCP
与UDP
的区别。 答:理解的不多,只知道TCP
是可靠传输UDP
是不可靠传输- 常用的web性能优化有哪些手段?
答:这道题我主要从
http
请求和页面渲染两个方面做得解答,http请求上主要是将代码分割,进行代码压缩,gZip编码,路由懒加载等一些手段来完成优化。页面渲染上主要涉及到DOM操作,减少重排、读写分离、动画上帧率跟浏览器的刷新频率保持一致。可以参考一下阮老师的博客网页性能管理详解 - 说一下作用域链。原型链。 答:说的主要是《JavaScript高级程序设计》这本书上的内容,说到原型链我一般会画一张原型链关系图。可以参考我写的一篇博客js总结系列(三)原型链
- 为什么
0.1 + 0.2 === 0.3
是false
? 答:这道题我主要是说了一下小数在内存中的存储方案,取的是一个近似值导致的精度丢失。 - 如何实现js的继承?你说的这些继承方式各自有什么缺点?如何实现完美继承? 答:构造函数继承、原型链继承、组合继承、完美继承。这些都是高程中的内容,可以照搬。
- 常用的设计模式有哪些?分别有哪些应用场景?
答:对设计模式总结的比较少,回答的时候说到了单例模式:用来做全屏遮罩或一些模态框;观察者模式:举了vue中实现数据绑定的例子;装饰者模式:用来扩展对象;工厂模式:举了
jQuery
中生成jQuery
对象的例子。大家可以专门做个总结。 - 如何实现一个可以设置过期时间的
localstorage
存储? 答:这题写了两三版,第一版考虑到的问题很少。在面试官的提示之下才有较高的完成度。 - 为什么会有跨域问题?常用的解决方案有哪些? 答:直接上阮老师博客浏览器同源政策及其规避方法、跨域资源共享 CORS 详解
- 常见的一些web安全问题
答:
XSS
、CSRF
let
和var
有哪些区别?new
关键字有什么作用?如何实现一个new
关键字的方法?- 外层div中有两个子元素,如何通过flex布局实现两个子元素垂直居中,左右分别顶到两边的布局?
- 如何通过定位的方式实现一个不确定宽高元素的垂直水平居中?
- 使用过node吗?主要做什么? 答:服务端node使用较少,主要是用来做一些打包时候的自定义功能脚本。平时做一些代理服务器啥的。后端的话主要是demo水平。
express
和koa
有什么区别? 答:了解的不多,主要是从回调的处理和中间件的使用不同两个方面- 知道三次握手和四次挥手吗? 答:略
- 谈谈你对闭包的理解。 答:大家还是自行百度比较好。
- 虚拟DOM是什么?了解diff算法吗? 答:虚拟DOM使用js对象来模拟DOM树的结构。js对象中有标签名、属性、子元素。具体细节大家自行百度吧,比我说的专业。
- vue和react中循环生成元素时的key有什么作用? 答:也是从diff算法的角度来说的,循环的时候key是虚拟DOM的唯一标志符,可以节约性能。
- DNS解析过程 答:浏览器缓存、操作系统配置文件、DNS服务器
window.onload
和document.ready
有什么区别? 答:window.onload
是页面多有的元素的已经渲染完成包括image
等。document.ready
是DOM
元素渲染完成,一些图片请求并不一定已经完成。- 移动端1px问题产生的原因是什么?有什么解决方案? 答:直接上文章移动端 1px 像素问题及解决办法
- rem的原理?还有哪些移动端布局方案?
答:说了一下根据屏幕宽度进行动态计算然后给
html
元素这是fontSize
。其他的方案主要说了一下响应式、vw、vh、百分比布局等。 - 移动端为什么
click
事件会延迟300ms?如何禁止屏幕的缩放? 答:主要是iPhone
为了判断用户是否发生了双击。禁止缩放通过设置视口的缩放比例。 - PC、移动端、微信小程序开发你会分别选用什么框架?说明你的理由。 答:略
- 了解
SSR
吗?有什么好处? 答:没用过,大概说了一下自己的理解,好处是首屏性能和SEO
- 怎么判断一个数据的类型?
答:
Object.property.toString.call(obj)
- 说一下vue的生命周期钩子?
vue-router
有哪些钩子?优先级是怎么样的? - 对于秒杀类的业务怎么确保倒计时的准确性? 答:随便想了想,我说可以在活动开始前的某个时间点发送一个请求获取服务端时间。现在想想好像也不太理想。
- 接口返回了一个非常庞大的数据怎么渲染到页面上? 答:面试官提到了数据层级很深,我提到了数据缓存、分页渲染、数据扁平化等一些手段。
- 常用的异步处理方案及它们的一些优缺点。
答:主要说了回调函数、
Promise
、generator
、async/await
- 原生js给一个元素绑定事件有哪些形式?有什么区别?
答:
onclick
和addEventListener
。前者只能绑定一次,多次绑定会发生覆盖,后者可以绑定多个事件处理函数,不会发生覆盖。