JS
原型/继承
原型:每创建一个新函数,会根据特定规则为该函数创建一个Prototype属性指向函数的原型对象。原型对象会自动获得一个constructor属性,指向prototype属性所在的函数指针。
函数经过调用成为构造函数,返回一个新的实例对象,这个对象有个_proto_属性,指向构造函数的原型对象。
原型链:对象通过_proto_指向父类对象,直到object对象为止。
- 使用hasOwnProperty()检查对象自身是否含有该属性。
- 使用in检查对象及原型链中是否存在某个属性。
执行上下文/作用域/闭包
this
Promise
Promise的源码实现(完美符合Promise/A+规范)
深浅拷贝
Eventloop
es6
HTML
h5:
标签:新增语义标签(aside/figure/section/header/footer/nav),多媒体标签(video/audio)
属性:增强表单,增强input的type属性;meta增加charset设置字符集;script增加async异步加载脚本
存储:localStorage/sessionStorage/indexDB
API:增加拖放API,地理定位,SVG绘图,canvas绘图,Web Worker,WebSocet
CSS
清除浮动
- 给父元素添加float,这样让父元素跟子元素一起脱离文档流浮动
- 给父元素一个固定高度
- 新建一个空的div,设置clear:both
- 给父元素添加overflow:hidden
- 通过伪类::after
::after{
content:"";
clear:both;//清除浮动
display:block;//确保是一个块级元素
}BFC
不会发生margin重叠;解决子元素浮动带来的高度坍塌和文字环绕。
,position:absolute;top:50%;left:50%。不同的是,接下来需要使用transform:translate(-50%,-50%),实现垂直居中
居中
- 水平居中:
- 垂直居中
- 块级元素
flexbox {display:flex;justify-content:center;align-items:center}position
伪类&&伪元素
- 格式化DOM以外的信息。 <a> 中的:link,:visited.这些信息不存在于DOM树中
- 不能被常规CSS选择器获取到的信息。 :first-child
盒模型
- ie盒模型: 此模型下的宽度计算为border+padding+content的宽度总和
- w3c模型:元素的宽度计算为content
浏览器
浏览器缓存
- 强缓存(expires/cache-control)
- 协商缓存(e-tag/last-modify)
- 缓存位置(ServiceWorker/Memory Cache/Disk Cache/Push Cache)
浏览器本地存储
- Cookie/SessionStorage/LocalStorage/IndexDcB
http/https/TCP/UDP
http1.0/http1.1:长连接/缓存处理/带宽处理/host头处理
http2.0新特性:多路复用/服务器端推送/二进制传输/heade头部压缩
http3.0 :UDP
https/http:
- https使用443端口,http使用80
- http是超文本传输协议,明文传输;https经过ssl加密的协议,传输更安全
- https除了tcp握手的三个包,还要加上SSL握手的九个包
非对称加密:
跨域
安全
CSRF:跨站请求伪造。
--验证Token
XSS:跨站脚本注入。利用网页开发时留下的漏洞,注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。
--输入检查。代码转义或过滤。/设置httpOnly(防止获取cookie)/开启CSP
--
非对称加密:
从输入URL到页面呈现过程发生了什么(重绘回流&&Eventloop)
(01)老生常谈的从 URL 输入到页面展现背后发生的事 | Web 前置知识
回流:DOM结构的修改引起DOM尺寸变化。(几何属性变化,DOM节点发生增减移动)
过程:生成DOM树,计算样式,生成布局树,建图层树,绘制列表
重绘:DOM的修改导致样式的变化但是没有影响到几何属性。
React
react-fiber/diff
React 源码剖析系列 - 不可思议的 react diff
生命周期
componentWillMount 在渲染前调用,在客户端也在服务端。
componentDidMount : 在第一次渲染后调用,只在客户端。之后组件已经生成了对应的DOM结构,可以通过this.getDOMNode()来进行访问。 如果你想和其他JavaScript框架一起使用,可以在这个方法中调用setTimeout, setInterval或者发送AJAX请求等操作(防止异步操作阻塞UI)。
componentWillReceiveProps 在组件接收到一个新的 prop (更新后)时被调用。这个方法在初始化render时不会被调用。
shouldComponentUpdate 返回一个布尔值。在组件接收到新的props或者state时被调用。在初始化时或者使用forceUpdate时不被调用。
可以在你确认不需要更新组件时使用。
componentWillUpdate在组件接收到新的props或者state但还没有render时被调用。在初始化时不会被调用。
componentDidUpdate 在组件完成更新后立即调用。在初始化时不会被调用。
componentWillUnmount在组件从 DOM 中移除的时候立刻被调用。redux/redux-thunk/react-route-dom
redux
Store:Redux只有一个Store,Store的State不能直接修改,每次只能返回一个新的State。
使用createStore函数生成Store。
使用store.subscribe方法设置监听函数一旦State发生变化就自动执行这个函数。
Action:Action就是View发出的通知,State要改变。store.dispatch是view发出Action的唯一方法。有一个Type属性,代表名称。
Reducer:纯函数。combineReducers把多个reducer合成一个根Reducer。
流程:
- 用户通过View发出Action。
store.dispatch(action) - Store自动调用Reducer,传入两个参数,当前State和收到的Action,返回新的State
xxReducer(previousState,action) - State一旦有变化,Store会调用监听函数。
store.subscribe() - store通过getState得到当前状态,重新触发渲染。
setState(store.getState())
react-redux
Provider:Provider从外部封装了整个应用,并向connect传递store
connect:连接react&&redux。
- 将store通过mapStateToProps进行筛选后使用props注入组件
- 根据mapDispatchToProps创建方法,
(mapStateToProps,mapDispatchToProps)
10行代码看尽redux实现 —— 全面剖析redux & react-redux & redux中间件设计实现 | 8k字
高阶组件
高阶组件接收react组件为参数,返回一个新的React组件。本质上是一个函数。
主要是封装并分离组件的通用逻辑,让通用逻辑在组件间更好的复用。
--与DOM操作不直接相关的。--请求发送,数据校验。
Redux-connect
React优化
- shouldComponentUpdate
- 不可变性:不要对数据进行修改,在现有集合的基础上创建新的集合。保持尽可能少的复制,提高性能。
- 显示列表是使用keys,让React更新速度更快。
- 代码分离,只加载模块或所需的文件的技术。
React-Native
性能优化
性能优化入手
- 分屏加载,页面需要渲染的数据较多时,先渲染首屏,下滑时再加载第二屏的数据。
- 图片大小优化,不影响视觉效果的前提下,把图片尺寸降到最低。
- 图片懒加载。
- Codesplitting,拆包,动态import
- 降低请求量:合并资源,减少http请求数,gzip压缩,懒加载
- 加快请求速度:cdn分发,预解析DNS,
- 增加缓存:离线缓存数据
- 渲染优化:首屏内容最小化,JS/CSS优化,加载顺序
工程化
webpack
其他:
(中篇)中高级前端大厂面试秘籍,寒冬中为您保驾护航,直通大厂