百度(get)
一面
- 手写一个评分组件
- 原型、原型链问题
function Person(name) {
this.name = name
return name
}
var p = new Person('test')
1. ``Person.__proto__``等于什么?
指向Function.prototype;构造函数的``__proto__``指向Function.prototype;
而对象的``__proto__``指向其构造函数的原型
[原型、原型链](https://www.cnblogs.com/webjoker/p/5319377.html)
2. new运算符的原理:
1. 创建一个空对象 ``a = {}``
2. 将空对象的原型赋值为构造函数的原型 ``a.__proto__ = A.prototype``
3. 更改构造函数内部this,将其指向新创建的空对象 ``A.call(a)``
4. 如果构造函数返回值为object,则返回该object;否则返回a;也回答了下一题;哎。。。。。。
3. Person中的return发生了什么?
如果name是基础类型,new Person()会返回Person的实例;
如果name是引用值,new Person()会返回name这个引用值
(再好好理解理解原型这块东西)
- 继承的实现
- promise了解多少,手写一个promise.all方法
- 判断是否是数组,instanceof的原理
instanceof原理只要右边变量的 prototype 在左边变量的原型链上即可(说白了,还是原型这块的东西) - 实现数组降维,用es6的扩展运算符实现
function myFlat(arr) {
const res = []
while(arr.length) {
let val = arr.shift() // 取到数组首值,并移除该值
if (Array.isArray(val)) {
arr.unshift(...val) // 如果是拿到的值是数组就将该值展开添加到数组头,这就做了一次降维
} else {
res.push(val) // 如果是值就直接添加到结果数组中
}
}
return res
}
- vue双向绑定的原理,什么时候会触发watcher清除
- webpack优化措施
- 谈谈cmd、amd、commonjs、es module模块化方案,cmd引入的拷贝还是引用
- 缓存原理
- 常见网络攻击及防御
- 跨域
- 聊项目
二面
- 二叉树的深度遍历,寻找是否有路径的和等于给定的值
root: {
left: root,
right: root,
val: number
}
function hasPathSum(root, sum) {
if (root === null) return false;
if (root.left === null && root.right === null) return root.val === sum
sum = sum - root.val
return hasPathSum(root.left, sum) || hasPathSum(root.right, sum)
}
- 非同源页面的跨域通信
- 实现loadjs去加载一个异步js文件,并使用.then的方式使用里面的方法
三面
- 聊了二三十分钟的人生
- webpack的设计模式、设计思想
- 前端万级大数据怎么处理
- 线上bug怎么处理
- 国际化的解决方案
极米(凉。。。。)
一面
- 聊项目
- 常规的一些面试题(不记录了)
- 跨域请求会到达服务器吗?
- 怎么理解Object的原型是Function的原型??有点蒙,再看看原型这部分内容吧
因为函数的__proto__
都是指向Function.prototype
的,所以Object的__proto__
就指向了Function的原型;
对象(实例)的__proto__
指向的是构造函数的原型,而非构造函数;
prototype
是函数的属性,里面默认有constructor
属性指向其构造函数本身
二面 hr面
三面 总监面+hr面
- 对红黑树的理解
- 对ci/cd的理解
- 用过哪些ui库,怎么评价element-ui
- node是怎样读取文件的
- 最后给我的建议:前端也需要有软件工程的概念;往前需要深入浏览器原理、js引擎,往后需要对node、操作系统有较深理解
(感觉二三面就不只考察前端的能力了,更考察对整个软件工程的理解)
WPS(get)
一面
没自我介绍,没聊项目,比较常规的面试题(不记录了)
- 了解linux和Nginx吗?(当时真没听清Nginx,因为平时都是说的ng。然后由结合linux,我以为后面的名词是unix之类的东西;太丢脸了)
- 了解图片懒加载吗?原理是什么?
我说了用data-src的属性去暂存链接,然后再可视范围时src去加载data-src的值。
然后他问我还有什么方法吗???emmm。。。。。
getBoundingClientRect()获取元素的大小和相对于试口的位置
IntersectionObserver方法
图片懒加载
二面
- 非同源页面的跨域通信
- 什么时候会第五次挥手
三面
聊项目
永远逃不开的话题,离职原因
腾讯音乐
一面
- 自我介绍(说我自我介绍很全面,哈哈哈哈哈)
- 一些常见的问题不记录了
- vue-loader的实现过程
- 浏览器怎么知道跨域的,如果是简单跨域请求会修改服务吗?
- node的事件循环机制?
- vue3.0的双向绑定原理??!!
- 怎么操作cookie
- 小程序,我说不了解,就没问了
腾讯金融
同时投了两个腾讯部门,导致腾讯音乐的二面邀约被取消了,冤。。。。。。
一面
- 笔试
- 好多网络相关的题,tcp三握四挥、https、http1和http2的区别、状态码、缓存、osi模型、tcp和udp区别
- 解释回流和重绘
- 怎么优雅的插入100的元素
使用文档碎片,createDocumentFragement - 使用es5实现const
- vue的双向绑定原理
- 移动端点击事件,移动端click为什么会有延迟
- 使用touch模拟click
- 解释点击穿透
- 聊项目
二面
- 如何定位bug
- 从技术的角度评价一个网站的优劣
- 聊项目
三面
- 聊项目
- 性能优化
- 移动端适配的解决方法
- node i/o操作的优化
- 深圳市上空同一时刻有多少架飞机??!!
阿里(个人原因,拒了hr面)
一面
都是从项目入手问的问题
- 深度拷贝
- 最长无重复字符子串的长度
- 缓存相关,last-Modified什么时候会改变
- base64的优缺点
- node什么时候会阻塞,midway的原理
- vue computed lazy的理解
- vue diff算法;ABCD->BCDE是怎么移动的
- 箭头函数和function的this指向,改变this指向的方法
- 性能优化,拆包,图片懒加载
- 客户端和web端通信问题,bridge的实现
- 运营页面的快速构建(我提到了珏哥的模板运营活动),动画库的选择
- 微前端(给自己挖坑。。。。)
二面
- 手写节流函数,介绍节流和防抖的应用场景
- 不使用setTimeout,使用打点的方式写节流函数
- 不使用闭包写节流函数
- this指向问题
- 为什么浏览器是60帧渲染,稳定吗
- for in和for of的区别,哪些类型可以使用for in和for of
- 怎么让对象使用for in
- 实现一个及时聊天页面
- 短轮询、长轮询、websocket 的区别
- websocket的实现
- http1.x和http2的区别,http2可以实现及时聊天吗
- http2怎么解决队头阻塞的
- http2在应用层的握挥过程(不是tcp的握挥)
总结:别给自己挖坑。。。。不清楚的就别提
字节
一二面(连着面,你敢信)
- https证书的作用
- tcp三次握手,如果客户端反复发起握手请求怎么处理
- requestAnimationFrame在事件循环中的位置
- vue模板怎么处理的,双向绑定原理
- proxy的使用
- webpack loader和plugin的区别
- webpack的构建流程
- webpack优化
- 防抖、节流,手写节流
- 事件循环的题
console.log(1);
setTimeout(() => {
console.log(2);
Promise.resolve().then(() => {
console.log(3)
});
});
new Promise((resolve, reject) => {
console.log(4)
resolve(5)
}).then((data) => {
console.log(data);
})
setTimeout(() => {
console.log(6);
})
console.log(7);
- node的http请求的header怎么处理,不同格式(content-type)的http请求怎么处理,用了什么中间件
- 柯里化函数的实现
- 手写代码
// JS编码实现一个render方法,使得可以这样调用,例如
const year = '2017';
const month = '09';
const day = '21';
const str = render('${year}-${month}-${day}');
console.log(str); // 输出2017-09-21
// 设计一个柯里化函数(currying ),实现sum(100,200)(300)();得到600
function currying(fn) {
// todo
}
var sum = currying(function () {
// todo
})
console.log(sum(100,200)(300)()); //600
console.log(sum(100)(300)(200)()); //600 console.log(sum(50)(50)(100)(150,50)()) //400
- 判断单向链表是否有环
- babel和polyfill的区别
三面+hr面(又是连着面)
- 聊项目
- css的布局方式,了解grid布局吗
- 缓存,使用场景
- vue双向绑定原理,watcher在何时被执行
- es10了解吗?。。。。。我只了解es6/7
- 为什么没有学react,以后的技术规划
- 移动端适配解决方案
- 自己给自己技术定级是多少,他居然说百度校招生定级是t5???!!!