面试时长:1小时13分钟
面试方式:电话面试
总结
这一次算是比较正规全面的一次面试,面试官技术很棒,而且全程提问的问题,如果我有哪里回答的不对或者是有疏漏的地方,会给与纠正与补充,对一些逻辑不太清晰的问题会引导梳理。个人感觉自己的表现一般,也是第一次面试这么长的时间(单次面试),涉及的问题也比较广泛。刚开始有点紧张,有些显而易见的问题由于紧张容易走近死胡同。还有一点就是疏忽的概念性的知识点,对于一些概念性的知识点不太熟悉,导致面试官问问题时,不能很快的反应出来,他说的其实是开发中经常用到的知识点。
JavaScript部分
基础知识
-
使用es5实现一个继承的方法
- 创建一个全新的原型对象Object.create(parent.prototype),复制prototype,并修正constructor
- parent.apply(this,arguments)
-
实现一个内存泄漏的闭包
-
要实现内存泄漏关键是要保持对变量的引用关系
-
使用全局变量
-
使用循环引用
-
-
实现一个沙箱环境(要求:不相互污染,能够通信)
- 隔离采用闭包方式,通信采用EventBus(弊端:无法完全隔离,还是能访问到全局变量)
- 隔离用worker方式,通信采用postMessage(弊端:有很多方法不能用,无法操作dom)
- 使用iframe(弊端:必须同一主域名下)
-
decodeURI和decodeURIComponent的区别以及url中有哪些特殊字符会被特殊处理
- decodeURIComponent可以对一些特殊字符进行编解码,如:? & # / : . ,而decodeURI不能
- 只要是url的保留字符都算是特殊字符,如分隔符/、哈希#、queryString ? 以及& 和 空格等
CSS部分
- 实现一个多列等高布局
- flex布局
- paddingBottom与marginBottom配合
- 如何制定一个ui规范
- 统一全局样式
- 抽象组件
- BFC(区块格式化上下文)
- 都有哪些操作可以创建
- overflow:非visible
- display: inline-block;
- 定位:absolute、fixed
- display: table-cell;
- 根元素float:非none;
- display:flow-root(用于修正float高度塌陷的问题,根本原理也就是建立一个区块格式化上下文)
- column-span: all
- 都有哪些操作可以创建
HTTP
- 常用的状态码
- 100-继续请求
- 101-切换协议
- 200 - 成功
- 201 - created(请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回)
- 202 - Accepted(服务器已接受请求,但尚未处理)
- 204 - 服务器处理成功,但没有内容需要返回
- 205 - 客户端应当重置视图(刷新网页或者是清空表达字段)
- 206 -服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。
- 301 - 永久重定向
- 302 - 临时重定向
- 304 - 缓存(未更改)
- 400 - 错误请求
- 401 - 未授权
- 403 - 禁止访问
- 404 - 找不到页面
- 405 - 客户端请求的方法被禁止,如使用get方式请求,但服务器禁止使用get方式请求
- 408 - 服务端等待客户端请求的时间过长,出现超时
- 500 - 服务端错误
- 501 - 服务器不支持请求功能,无法完成请求
- 502 - 网关错误
- 503 - 服务不可用,可能超负荷
- 504 - 超时
- 505 - 服务器不支持请求的http版本
- 缓存
- 协商缓存
- 原理是判断文件有没有改变,没改变就不需要请求服务,直接使用缓存,有改变则请求服务
- etag:文件的hash,如果文件发生了改变,它也会相应的发生变化
- last-modified:最后修改时间
- 强制缓存
- 服务端强制规定一个有效期,过了这个有效期就会请求服务端看文件是否更新,如果更新则重新获取资源,同时更新有效期时间,如果没更新则使用缓存
- 禁止缓存
- 协商缓存
数据结构
- 双向链表
- 双向链表查找的复杂度
- 查找思路:由于双向链表保存有上一个节点和下一个节点的引用,因此我们可以采用二分思想,每次取两个节点出来比较是否等于要查找的元素
- 时间复杂度:O(n/2)
- 空间复杂度: O(1)
- 双向链表查找的复杂度
- 哈希表
- 哈希表是如何实现的
- 哈希表本质是一个散列表,通过结算处带储存信息key值的hash,然后将其转换成索引在存放记录的数组或链表中查找指定的值
- 哈希表底层的数据结构是什么
- 底层可能是个数组或链表
- 哈希表是如何实现的
- base64编码原理
编译原理
- vue的编译原理引申到一个通用的代码编译
- 词法分析
- 如找出关键词:const let for等
- 语法分析
- 对语法进行检查,如const后面跟的是否是一个合法的变量等等。
- 跨语言编译的实现
- 通过词法分析和语法分析生成一个类似抽象语法树的结构对象后,根据不同的平台采用不同的代码生成器生成代码(如生成ts代码或生成js代码等等)
- 为什么Vue没有使用词法分析和语法分析,而是直接就用了一个编译器进行编译
- vue需要编译的模板相对比较简单(就是html模板),不需要使用词法分析和语法分析,类似babel之类的,需要编译JavaScript的时候,其实就需要用到词法分析和语法分析
- vue是运行在浏览器端的,要求加载速度要快,将词法分析和语法分析合并成模板解析器能够极大的缩小代码量(虽然损失了分层架构带来的可维护性等优势)
- 词法分析
复试总结:面试总结:欢聚时代旗下100教育复试