百度一面
- 自我介绍
- 移动端相关的CSS(flex、vm & vh、rem & em、meta)
- Event Loop
- 发请求是异步吗?
- 什么是跨域?跨域请求有哪些方式(jsonp、CORS、WebSocket、Vue的devServer)
- 详述CORS(简单请求:请求头带Origin、复杂请求:OPTIONS预检请求)
- 从输入url到页面呈现发生了什么?
- 网络请求(构建请求、查找缓存、DNS解析、建立TCP链接、发送HTTP请求)
- 网络相应
- 渲染阶段(构建DOM树、样式计算、布局阶段、分层、绘制、分块、光栅化、合成)
- 怎样建立TCP链接,即三次握手是什么
- 缓存包括哪些?相关的请求头有哪些?
- 怎样区分强缓存和协商缓存
- Expires、Cache-Control、Last-Modified、If-Modified-Since、Etag、If-None-Match各自的含义
- 用过的HTTP状态码有哪些,分别有什么含义
- 闭包(含义、优缺点、使用场景、怎样解决闭包带来的内存泄露问题)
- 怎样理解作用域(ES6、ES5)怎样改变作用域(call、apply)
- 怎样理解this?箭头函数的this
- 怎样理解 async await(使用、优点)
- 防抖和节流的区别、原理、使用场景
- 原型链、ES6的继承(extends对原型链的影响)
- new的原理
- 用过哪些页面性能优化的方法(Object.freeze、缓存、资源按需加载、异步加载非核心代码、Repaint、Reflow)
- audio标签在不同手机浏览器的兼容性问题(在Safari和部分安卓浏览器中,audio标签的自动播放和循环播放会有兼容性问题)
- 代码题:用Promise包一个xhr请求 & 快速排序算法 二选一
百度二面
- 自我介绍
- 问了实习经历,简述项目
- 除了工作,平时自己一般怎么学习,印象最深刻的知识点是什么?
- (上一问回答了Vue的MVVM源码)简述了源码的原理
- 问实习项目,包括自己印象最深刻的解bug,感觉自己思路比较厉害的
开始基础问题
- 从输入url到页面呈现发生了什么?(和一面一样)
- 缓存相关:304状态码的含义
- 介绍HTTP三次握手四次回收以及原因
- 浏览器的渲染过程
面试官突然发现基础问题一面都基本问完了,开始算法题
- 一个数组(包括正负重复数字),求其中三个加和为零的组合 LeetCode三数之和
const sumZero = function(nums) {
let res = [];
const len = nums.length;
if(nums == null || len < 3) return ans;
nums.sort((a, b) => a - b);
for (let i = 0; i < len ; i++) {
if(nums[i] > 0) break;
if(i > 0 && nums[i] === nums[i-1]) continue;
let L = i + 1;
let R = len - 1;
while(L < R) {
const sum = nums[i] + nums[L] + nums[R];
if(sum === 0) {
res.push([nums[i], nums[L], nums[R]]);
while (L < R && nums[L] === nums[L + 1]) L++;
while (L < R && nums[R] === nums[R - 1]) R--;
L++;
R--;
}
else if (sum < 0) L++;
else if (sum > 0) R--;
}
}
return res;
};
- 上一个算法题的进阶,求三数之和最接近零的情况,返回这个最接近零的值(假设不存在最接近的值有重复的情况,例如-1 & 1)
const sumZero = function(nums) {
const len = nums.length;
if(nums === null || len < 3) return null;
nums.sort((a, b) => a - b);
let mindeff = nums[0] + nums[1] + nums[2];
for (let i = 0; i < len ; i++) {
if(nums[i] > 0) break;
if(i > 0 && nums[i] === nums[i - 1]) continue;
let L = i + 1;
let R = len - 1;
while(L < R) {
const sum = nums[i] + nums[L] + nums[R];
if(Math.abs(mindeff) > Math.abs(sum)) {
mindeff = sum;
}
if(sum === 0) {
return 0;
} else if (sum < 0) {
L++;
} else if (sum > 0) {
R--;
}
}
}
return mindeff;
};
旷世一面
自我介绍
- Event Loop,微任务宏任务的含义与区别
- new运算符
- 当有一个非常大的数组时,取第一个元素与取最后一个元素的时间复杂度相同吗?
- 常用的ES6特性
- 箭头函数的优点
- 闭包
- div居中的几种方案(分该div长宽是否已知回答)
- position的取值及含义
- Vue的生命周期函数,常用的有哪些,分别用于什么场景
- v-if、v-show的区别及使用场景
- 为何Vue中的data是一个函数
旷世二面
自我介绍
- 介绍项目背景
- 用过的跨域方法(jsonp的弊端)
- vue自定义指令
- mixin
- webpack
- nodejs