1-1. 重点目录
HTML5重点:
developer.mozilla.org/zh-CN/docs/…
- 语义化标签类
- 音视频处理 (代替了Flash)
- Canvas/ WebGL
- History API
- requestAnimationFrame (JS定时器动画卡顿不连贯,新方法赫兹和浏览器保持一致)
- 地理位置
- Web Socket (Socket IO用于实时通讯)
CSS3重点:
- 常规
- 动画
- 盒子模型
- 响应式布局
JavaScript重点:
- ES 3/5/6/7/8/9
- DOM
- BOM
- 设计模式
- 底层原理 (栈堆内存, 闭包作用域,面向对象,THIS,EventLoop,浏览器渲染原理,回流重绘)
网络通信层重点:
- AJAX/Fetch/axios
- HTTP 1.0/2.0
- TCP
- 跨域处理方案
- 性能优化
Hybird或者APP再或者小程序:
- Hybrid
- uni-aqq
- RN
- Flutter
- 小程序 MPVUE
- Weex
- PWA
工程化方面重点:
- Webpack
- Git
- Linux/nginx
全栈方面重点:
- node
- express
- koa2
- mongodb
- nuxt.js/ next.js
框架方面
- ** Vue: **
- 基础知识
- 核心原理
- vue-router
- vue-cli
- vuex
- element ui
- vant
- cube
- SSR
- 优化
- ** React: **
- 基础知识
- 核心原理
- react-router-dom
- redux
- dva
- umi
- mobix
- antd
- antd pro
- SSR
- 优化
1-2. 常见的CSS面试题和回答技巧
问题1: 掌握盒子水平垂直居中的五大方案
定位:(三种)
- 知道具体宽高
- 有宽高,但是不需要知道具体的
- CSS3的translate,不需要具体宽高,兼容性不好
display:flex 弹性伸缩盒模型
Javascript获取元素进行计算
display:table-cell
有趣,本来适用于控制文本,需要改成inline-block再处理,要求父级有固定宽高
回答技巧:先回答在之前的项目中非常常见,随着某一个技术语言的兴起发现某个技术更好,在掘金上又看到有哪个方案。
问题2:关于CSS中盒模型的几道面试题
标准盒模型,怪异(IE)盒模型,flex弹性盒模型
回答技巧:先回答一下盒模型分类,然后点出标准盒模型修改content会使整个容器尺寸变大的问题。然后提到平时项目用box-sizing:border-box比较多,后来用Element-UI看到有一些源码里也是直接用IE盒模型来避免问题。
问题3:几大经典布局方案
- 圣杯 (中间和两边在一个容器里)
- 双飞翼 (中间和两边在不同的容器) 总结:左右固定,中间自适应
假设左右两边是200px,父容器左右两边各留出200px padding。左边margin-left:100%,右边margin-left:-200.
- 使用CALC (CSS3属性,不建议,CSS3表达式计算起来比较慢)
- Flex布局
flex:1相当于自动填满剩余的空间
- 定位方式:中间设为margin:0 200px,两边aboslute定位
问题4:响应式布局三大方案
- media媒体查询写不同样式,用于PC端和手机端同项目,比如PC三列,手机1列 (主流)
- rem:等比缩放 (主流)
- flex可以实现一些具体功能
- vh/vw:按照窗口高度/宽度百分比布局
课后作业
- 使用css,让div消失在视野中,发挥想象力
- 说明z-index的工作原理,适用范围?(文档流,定位)
- 谈谈对HTML5的理解?
- 如何是一个div里面的文字垂直居中,且该文字的大小自适应
- 不考虑其他因素,下面哪种的渲染性能比较高?
- css引入文件放在哪
下面的渲染效率高,因为要先筛选出所有a标签再去筛选.box
2-1 闭包,堆栈,深浅克隆
1.对象(数组)的深克隆和浅克隆(头条)
- 一层浅克隆
let obj2 = {};
for (let key in obj) {
if (!obj.hasOwnProperty(key)) continue;
obj2[key] = obj[key];
}
或者
let obj2 = {
...obj
}
- 深克隆
obj2 = JSON.parse(JSON.stringify(obj));
弊端:如果遇到日期,正则,function会报错
function deepClone(obj) {
if (obj == null || typeof obj !== "object") return obj;
if (obj instanceof RegExp) {
return new RegExp(obj);
}
if (obj instanceof Date) {
return new Date(obj);
}
let newObj = new obj.constructor;
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepClone(obj[key]);
}
}
return newObj;
}
let obj2 = obj
2.BAT笔试中关于闭包和原型链的问题
ex1: 答案培训,属性名不能重复,大部分属性名会转化为字符串储存
- 堆:存储引用类型值的空间
- 栈:存储基本类型值和制定代码的环境 => Follow up:数组和Object区别
ex2: 答案珠峰,因为Symbol会创建一个唯一的object,Symbol('1') != Symbol('1')
=> Follow up:自己实现symbol
ex3:答案是培训,任何object.toString都会变成[Object Object],这样会a[c]把a[b]覆盖掉 => Follow up:Object.prototype.toString/ valueOf.toString
ex4:字符串4,因为alert弹出来的结果都是toString(字符串)
闭包:内存不销毁
ex5: 答案'1' '4',闭包的功能:私有化变量, 保护全局变量,保留上级作用域你
3.一道关于面向对象面试题所引发的血案(阿里)
function Foo() {
getName = function() {
console.log(1);
}
return this;
}
Foo.getName = function() {
console.log(2);
}
Foo.property.gatName = function() {
console.log(3);
}
var getName = function() {
console.log(4);
}
function getName() {
console.log(5);
}
Foo.getName(); 2
getName(); 4
Foo().getName(); 1
getName(); 1
new Foo.getName(); 2
new Foo().getName(); 3
new new Foo().getName(); 3
变量提升:js代码在当前作用域下代码执行之前,把所有var提前声明和function提前声明和赋值
4.一道题让你彻底掌握JS中的EventLoop (同步/异步)
- 浏览器是多线程的
- JS是单线程的 -> 浏览器只给了JS一个线程来渲染
- Promise, SetTimeOut, async/await 会把事件加入EventLoop,(SetTimeOut,事件绑定,Ajax会加入宏任务, promise/async/await是微任务)
- 执行顺序:主栈任务 -> 微任务 -> 宏任务
- 微任务有些处理会按顺序,有些会先执行then
5.课后作业:
- 第一题
箭头函数不能new,箭头函数没有圆形链,没有constructor,没有自己的执行主体,this继承执行上下文this
- 第二题
var x = 2;
- 第三题
对象==字符串 对象.toString()变为字符串
null == undefined 相等,但是和其他值比较就不相等
NaN == NaN不相等
剩下的都转化为数字
第一种:隐式类型转化toString()属性
var a = {
i : 0,
toString() {
return ++this.i;
}
}
第二种:数据劫持
var i = 0;
Object.defineProperty(window, 'a', {
get() {
// defineProperty Getter拦截其中不能再次获取当前属性,比如a++, 会无限循环
return ++i;
}
});
不能
-
第四题
-
第五题
3-2 各大框架里面的核心内容
1. Vue 2.0/3.0 双向数据绑定原理
- Vue 2.0 Object.defineProperty
姓名: <span id = "spanName"></span>
<input type = "text" id = "inpName">
<script>
let obj = {
name: ''
};
let newObj = JSON.parse(JSON.stringify(obj));
Object.defineProperty(obj, 'name', {
get() {
return newObj.name;
},
set(val) {
if (val === newObj.name) return;
newObj.name = val;
observer();
}
})
function observer() {
spanName.innerHTML = obj.name;
inpName.value = obj.value;
}
//相当于v-model
inpName.oninput = function () {
obj.name = this.value;
}
/*存在问题
1.对原始数据克隆
2.需要分别给对象中每一个属性设置监听,初始化没有的属性可能监听不到
*/
- Vue 3.0 用ES6新属性Proxy
//可以对Object进行整体的数据劫持
let obj = {};
obj = new Proxy(obj, {
get(target, prop) {
console.log('A');
return target[prop];
},
set(target, prop, value) {
console.log('B');
target[prop] = value;
observer();
}
});
2. React的MVC原理
其实MVC和MVVM原理几乎相同,只不过React中的事件监听我们需要自己来写,Vue中已经帮我们做好了事件监听 (v-model)
MVC:单向数据绑定,默认实现了数据的更改更新视图
MVVM:双向数据绑定,用onchange/oninput来实现了视图层的更改更新数据
3.跨域问题的解决方案和实现原理
前后端分离以后不再配置在同一台服务器,协议域名端口号有一个不同就算跨域。前端为了高效会在全国各地设置CDN服务器,也会为了效率单独设置图片服务器,音视频服务器。
-
第一阶段:Jsonp,只能用于get请求(利用scirpt,link,img等标签请求忽略跨域) 发送请求时动态创建一个script标签,在src的连接中加入请求的function。服务器在返回的时候也把结果拼成func({...})
缺点:不安全,有缓存,大小限制,需要服务器单独配置
-
第二阶段:基于iframe的跨域解决方案 window.name/ document.domain/ location.hash/ post message
-
第三阶段:CORS跨域资源共享 服务器端可以通过Access-Control-Allow来允许跨域登陆,然后用token(第一次登录以后服务器返回token,之后在请求的时候带上token来确认身份)来确保安全
-
OPTIONS试探性请求,看服务器端是否响应再发送post请求
-
限制:允许访问的源有数量限制
-
开发:在package.json里用proxy来代理把所有向自己源地址发起的请求都转发到目标地址(devServer和webpack帮助我们跨域)
-
产品:由后段进行nginx反向代理
4.Vue/React框架中关于组建信息通信引发的面试题
-
Vue 属性传递,发布订阅(EventBus), Provide/inject, slot, children, vuex
-
react 属性, 发布订阅, React.Context, redux/react-redux/ mobix/ dva