在这互联网的寒冬腊月时期,虽然说过了金三银四,但依旧在招人不断。更偏向于招聘高级开发工程师。本人在这期间求职,去了几家创业,小厂,大厂厮杀了一番,也获得了本身满意的offer。javascript
整理一下本身还记得的面试题,但愿能帮助到还在求职的你。大佬略过,不喜勿喷。css
记录下我遇到的面试题,都有大佬分享过,附上各个大佬的文章,总结出其中的主要思想便可。html
概念就不介绍了,请看一个例题,若你能立马反应过来,就说明掌握的不错了。vue
/* 红色区域的大小是多少? */
.box {
width: 200px;
height: 200px;
padding: 20px;
margin: 20px;
background: red;
border: 20px solid black;
box-sizing: border-box;
}
复制代码
贴上一位腾讯大佬总结的文章java
16种方法实现水平居中垂直居中node
按照固定宽高和不固定宽高分类各说几个方法就能够了。react
/* 浮动布局 */
.layout.float .left{
float:left;
width:300px;
background: red;
}
.layout.float .center{
background: yellow;
}
.layout.float .right{
float:right;
width:300px;
background: blue;
}
/* 决定定位布局 */
.layout.absolute .left-center-right>div{
position: absolute;
}
.layout.absolute .left{
left:0;
width: 300px;
background: red;
}
.layout.absolute .center{
left: 300px;
right: 300px;
background: yellow;
}
.layout.absolute .right{
right:0;
width: 300px;
background: blue;
}
/* flex布局 */
.layout.flexbox{
margin-top: 110px;
}
.layout.flexbox .left-center-right{
display: flex;
}
.layout.flexbox .left{
width: 300px;
background: red;
}
.layout.flexbox .center{
flex:1;
background: yellow;
}
.layout.flexbox .right{
width: 300px;
background: blue;
}
复制代码
固然还有 table
布局 和 grid
布局。webpack
当你回答出来之后,面试官还可能会追问你,这几种布局有什么优缺点,兼容性?git
若是把高度已知换成未知,又该怎么作?
这些都是咱们要考虑总结的。
基本思路和三栏布局同样
table
布局就登场了
section {
width:100%;
display: table;
}
article {
display: table-cell;
}
.left {
height: 100px;
background: red;
}
.right {
background: black;
}
复制代码
用 padding-bottom
撑开边距就能够了。
section {
width:100%;
padding-bottom: 100%;
background: #333;
}
复制代码
css
选择器匹配元素是逆向解析
因此为了减小查找时间,尽可能不要直接使用标签选择器。
请参考网易云社区
的文章CSS动画的性能分析和浏览器GPU加速
/* 方法一 */
a = a + b;
b = a - b;
a = a - b;
/* 方法二 */
a = a - b;
b = a + b;
a = b - a;
/* 方法三 */
a = {a:b,b:a};
b = a.b;
a = a.a;
/* 方法四 */
a = [a,b];
b = a[0];
a = a[1];
/* 方法五 */
[a,b] = [b,a];
复制代码
/* 选自 yck 文章 */
function create(Con, ...args) {
let obj = {}
Object.setPrototypeOf(obj, Con.prototype)
let result = Con.apply(obj, args)
return result instanceof Object ? result : obj
}
复制代码
若是你能清楚的了解上边代码的原理,请忽略。
否则的话建议阅读下边大佬的文章。
推荐 yck
的文章 重学 JS 系列:聊聊 new 操做符
不管是笔试仍是面试,高频出现,要知其然还要知其因此然。
/* 选自 小美娜娜 文章 */
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
console.log( 'async2');
}
console.log("script start");
setTimeout(function () {
console.log("settimeout");
},0);
async1();
new Promise(function (resolve) {
console.log("promise1");
resolve();
}).then(function () {
console.log("promise2");
});
console.log('script end');
复制代码
若是你能很清楚的知道每一步的输出,能够忽略。
否则的话建议阅读下边大佬的文章,解释的很详细。
推荐 小美娜娜
的文章 Eventloop不可怕,可怕的是赶上Promise
function inherits(childCtor, parentCtor) {
function tempCtor() {};
tempCtor.prototype = parentCtor.prototype;
childCtor.prototype = new tempCtor();
childCtor.prototype.constructor = childCtor;
};
复制代码
好比说 原型继承,构造函数继承,组合继承等。
向面试官从简到难介绍每一个继承的优缺点,一步步的写出最完美的继承。
绝对能加好多分。
推荐一篇 路易斯
的文章 JS原型链与继承别再被问倒了
首先你须要对 promise 有一个清晰的认识,封装过请求,使用过它的 api 等。
请参考 前端劝退师
的文章 「中高级前端面试」JavaScript手写代码无敌秘籍
当你说出 promise.all 和 promise.race 的区别后,面试官可能就会接着考察此题。
/* 使用 async await */
async function queue(tasks) {
const res = []
for (let promise of tasks) {
res.push(await promise(res));
}
return await res
}
queue([a, b, c])
.then(data => {
console.log(data)
})
复制代码
固然也可使用 reduce
方法。
考察对模块化的理解。 区分 Es6 和 commonJs 规范。
能够参考 有赞 2dunn
的 文章 import、require、export、module.exports 混合使用详解
当你回答出 vue 中用 emit 通讯的时候,就要当心了。
EventEmitter 方法主要包含了 on,emit,once,off方法。
class Event {
constructor() {
this.events = Object.create(null);
}
on(name, fn) {
if (!this.events[name]) {
this.events[name] = []
}
this.events[name].push(fn);
return this;
}
emit(name, ...args) {
if (!this.events[name]) {
return this;
}
const fns = this.events[name]
fns.forEach(fn => fn.call(this, ...args))
return this;
}
off(name,fn) {
if (!this.events[name]) {
return this;
}
if (!fn) {
this.events[name] = null
return this
}
const index = this.events[name].indexOf(fn);
this.events[name].splice(index, 1);
return this;
}
once(name,fn) {
const only = () => {
fn.apply(this, arguments);
this.off(name, only);
};
this.on(name, only);
return this;
}
}
复制代码
能够参考 尤大大
的 vue 源码 vue-event
若是你能清楚的知道每一个this的指向,能够忽略。
好比说 默认绑定,隐式绑定,显示绑定,new 绑定。
/* 节选自 京东小姐姐 文章 */
var obj = {
hi: function(){
console.log(this);
return ()=>{
console.log(this);
}
},
sayHi: function(){
return function() {
console.log(this);
return ()=>{
console.log(this);
}
}
},
see: function() {
console.log(this);
(function(){
console.log(this)
})()
},
say: ()=>{
console.log(this);
}
}
let hi = obj.hi();
hi();
let sayHi = obj.sayHi();
let fun1 = sayHi();
fun1();
obj.say();
obj.see();
复制代码
不清楚的话,建议阅读一下
京东小姐姐
的文章 嗨,你真的懂this吗?
var foo = (...args) => {
return args[0]
}
console.log(foo(1))
复制代码
var foo = () => {};
console.log(foo.prototype) //undefined
复制代码
/* 如下代码会输出什么 */
localStorage.setItem('show',false);
console.log(localStorage.show || '显示')
复制代码
有的大厂面试官须要你手写这个过程,很残忍有木有。
请参考 360-chenhongdong
大佬的文章 让虚拟DOM和DOM-diff再也不成为你的绊脚石
使用 v-for
更新已渲染的元素列表时,默认用就地复用策略。列表数据修改的时候,他会根据key值去判断某个值是否修改:若是修改,则从新渲染这一项;不然复用以前的dom,仅修改value值。
详细参考 阿里-funnycoderstar
文章为何使用v-for时必须添加惟一的key?
我猜你可能会回答 v-show
经过控制样式的 display: none
和 display: block
实现显示隐藏的。 你以为这样合理吗?
好比说:对一个 img 或者 span 使用 v-show,那么当它为 true 的时候不就把内联元素改为块级元素了嘛。
出题目啦:
/* 1.此时span是显示仍是隐藏? */
<span class="span" v-show="isShow">111</span>
<script> data() { return { isShow: false } }, </script>
<style> .span { display: block; } </style>
/* 2.此时span是显示仍是隐藏? */
<span class="span" v-show="isShow">111</span>
<script> data() { return { isShow: true } }, </script>
<style> .span { display: none; } </style>
复制代码
v-show 控制显隐,是经过 js 代码去修改元素的 element style。 若是 value 为 false,设置
display: none
; 若是 value 为 true,清除 display 属性。 因此 value 为 true 时,只是将 element style 中的 display 效果清除,并不能覆盖 css 中的 display 样式。
不要直接巴拉巴拉的说出那几个英文单词,建议按照官网图的执行顺序来引出各个生命周期名称,会有加分的。
React 并非将 click 事件绑在该 div 的真实 DOM 上,而是在 document 处监听全部支持的事件,当事件发生并冒泡至 document 处时,React 将事件内容封装并交由真正的处理函数运行。
详情请参考文章 蚂蚁金服-Nekron
大佬的文章 React合成事件和DOM原生事件混用须知
不要着急回答是异步的,再上问的基础上 setState 也能够是同步的。
setState
只在合成事件和钩子函数中是“异步”的,在原生事件和 setTimeout
中都是同步的。
详情请阅读 饿了么-虹晨
大佬的文章 你真的理解setState吗?
React 是这么干的:你给我一个数据,我根据这个数据生成一个全新的 Virtual DOM,而后跟我上一次生成的 Virtual DOM 去 diff,获得一个 Patch,而后把这个 Patch 打到浏览器的 DOM 上去。完事。而且这里的 Patch 显然不是完整的 Virtual DOM,而是新的 Virtual DOM 和上一次的 Virtual DOM 通过 diff 后的差别化的部分。
Vue 在渲染过程当中,会跟踪每个组件的依赖关系,不须要从新渲染整个组件树。
React 每当应用的状态被改变时,所有子组件都会从新渲染。 这能够经过 shouldComponentUpdate 这个生命周期方法来进行控制。
React diff的是 Dom,而 Vue diff 的是数据。
从提取公共模块,区分开发环境,移除重复没必要要的 css 和 js 文件等方面说。
推荐arlendp2012
的文章 Webpack打包优化
推荐whjin
的文章 webpack原理
主要介绍 jsonp 和 cors 便可,其余能够一笔带过。
推荐阅读 浪里行舟
大佬的文章 九种跨域方式实现原理(完整版)
简要回答出 域名解析,返回资源,浏览器渲染,重排重绘概念等便可。
推荐 浪里行舟
文章从URL输入到页面展示到底发生什么?
分为 强缓存 和 协商缓存, 各自的标识要记住。
推荐 黑金团队
的文章 前端缓存最佳实践
推荐名扬
的文章 浅解强缓存和协商缓存
重点是 301 302 304 401 等,要给面试官介绍清楚。
304 的话就会涉及到上问的缓存,能详细介绍下会是个加分项。
推荐骑摩托马斯
文章,有图有文字 具备表明性的 HTTP 状态码
要记住 cookie 的几个属性值,分别是作什么的。
好比说 cookie 设置了 express 属性,存储位置有什么区别?
好比说 a.snow.com 和 b.snow.com 两个网页如何共享 cookie ?
推荐 Damonare
的文章 Javascript 本地存储小结
介绍几个,而后说清楚各自的做用便可。
又会涉及到 缓存头的知识。
推荐很是兔
的文章http请求头与响应头的应用
两种模式 hash 和 history。
推荐寻找海蓝96
的文章 面试官: 你了解前端路由吗?
全局变量,未清除的定时器,闭包,以及 dom 的引用等。
推荐掘金的LeviDing
文章 [译] JavaScript 工做原理:内存管理 + 处理常见的4种内存泄漏
主要从 XSS 和 CSRF 两个方面回答便可。
推荐 京东小姐姐
的文章 【面试篇】寒冬求职之你必需要懂的Web安全
这题道理很深,也有不少误区。
推荐 WebTechGarden 微信公众号
的文章 99%的人都理解错了HTTP中GET与POST的区别
HTTP2号称可让咱们的应用更快、更简单、更稳定,它完美解决了1.1版本的诸多问题。
推荐黑金团队
的文章 面试官问:你了解HTTP2.0吗?
欢迎讨论、、、
也欢迎讨论,,,
写业务的同时,不要忘记提升本身的基础知识,css,js,http 等,才会在面试中脱颖而出。
水平有限,若是有不妥的回答,还望指出,谢谢。
下篇总结下遇到的编码算法相关题目。
自认很菜,建立了一个数据结构和算法的交流群,不限开发语言,前端后端,欢迎各位同窗入驻。
群以超过扫码限制人数,能够加我好友,邀请你入群。
请备注:掘金加群
哦