# 一面
# 说出打印结果
# 手写原型链继承
# 实例属性和原型属性的区别
# instancef 的原理
# 浏览器缓存
# Service Worker 大小大概是30Gb,如果用户硬盘没有那么大怎么办
# Service Worker 的大小和强缓存、协商缓存的大小是一起计算的还是分开计算
# Push Cache 的具体处理方式
# HTTP2 的优缺点
# HTTP2 有没有可能比 HTTP1 还要更慢
# var、let、const 的区别
# 说出打印结果
// 任务
// 面试官提出的问题将出现在这里。
// 写出下面这段代码打印的结果
async function async1() {
console.log('async1 start');
await async2();
console.log('async1 end');
}
async function async2() {
console.log('async2 start');
}
console.log('script start');
setTimeout(function() {
console.log('setTimeout');
}, 0);
async1();
new Promise(function(resolve) {
console.log('promise1');
resolve();
}).then(function() {
console.log('promise2');
}).then(function() {
console.log('promise3');
});
console.log('script end');
# webpack
# 常用插件
# 如果有一个工程打包特别大,如何进行优化
# cjs 和 esm 模块化的区别
# es6+ 有哪些新的语法
# 跨域解决方案
# 说一下 CORS 中的预请求
# xss 和 csrf
# 用户信息存储的方式
# React 性能优化的方式
# 实现一个节流函数
要求初次执行的时候立刻执行
# 二面
# 自我介绍
# 介绍一下你们的组件库
# 有哪个组件最让你印象深刻
# 这个组件的原理介绍一下
# 这个组件有做兼容性处理吗
# 说出以下代码的输出
<body>
<div id="box">
<a href="javascript:console.log(1)" id="anchor">Click</a>
</div>
</body>
<script>
var box = document.getElementById('box')
var anchor = document.getElementById('anchor')
anchor.addEventListener('click', function() {
console.log(2)
})
box.addEventListener('click', function() {
console.log(3)
}, true)
box.addEventListener('click', function() {
console.log(4)
})
</script>
# let a = "abc"
,解释器在解释在这句话的过程中,内存发生的变化,比如内存放在哪里,申请了多大的内存
# 介绍一下 esm 和 cjs 的差异
# 介绍一下前端安全问题
# 假设有一个页面需要实现下拉无限滚动加载,如何实现和优化
# 笔试题
// 实现如下这样的函数`f()`,要求调用深度不限。(考察点:对 JS 对象化的理解)
// f(1).val === 1
// f(1)(2).val === 3
// f(1)(2)(3).val === 6
// f(10)(100)(1000)(10000).val === 11110
// f(a0)(a1)(a2)...(an).val === a0 + a1 + a2 +...+ an