axios 封装
1 | import Axios from "axios"; |
当前权限管理流程
- 默认初始化所有路由数据,并未添加路由表
- 通过后台数据筛选路路由添加路由表
- 其实还好菜单信息完全配置在后台只维护映射,前端添加
后端同时添加映射信息(麻烦点)
1 | graph LR |
框架权限管理流程
配置路由本身有角色信息
1 | graph LR |
新路由想法(参考网络)
- 前端添加数据结构,后端维护相应简单的数据结构
- 页面中转
vue.config.js
- 复写
- 清除已有数据
- 修改
暂定
- 入口
- 配置
- 路由
- api
- 权限
- utils
- 请求
- 鉴权
- 异常上报
- 按需引入
可视化
1 | graph LR |
手写代码及原理
节流
- 原理: 解决页面频繁计算;定义间隔,不到时间直接返回
1
2
3
4
5
6
7
8
9
10
11function throtter(func, delay) {
let lockFlg = false;
return (...args) => {
if (lockFlg) return;
func(...args);
lockFlg = true;
setTimeout(() => {
lockFlg = false;
}, delay);
};
}防抖
- 原理:解决频繁请求;定义间隔,重复请求清空定时器
1
2
3
4
5
6
7
8
9
10
11
12function debounce(func ,delay, immediately){
let timer = null
return (...args)=>{
clearTimeout(timer)
if(immediately){
func(..args)
}
timer = setTimeout(()=>{
func()
},delay)
}
}柯里化
- 原理: 函数参数收集直到参数收集完成后执行
1
2
3
4
5
6
7
8
9
10function currying(func, ...args) {
let len = func.length;
return (...arg) => {
arg.unshift(...args);
if (arg.length < len) {
return currying(func, ...arg);
}
return func(...arg);
};
}- 原理: 收集参数,不传参数时执行(处理不定参数情况)
1
2
3
4
5
6
7
8function currying1(func, ...args) {
return (...arg) => {
if (arg.length > 0) {
return args.push(...arg);
}
return func(...args);
};
}apply
- 原理:鸭子模型改变调用者
1
2
3
4
5
6function apply(obj = window, args = []) {
obj.fn = this;
const res = obj.fn(...args);
delete obj.fn;
return res;
}bind
- 原理:返回闭包,需处理 new 以及二次绑定
1
2
3
4
5
6
7
8
9function bind(obj = window, args = []) {
const _Fn = this;
return function F(..._args) => {
if(this instanceof F){
return new _Fn(...args, ..._args)
}
return _Fn.apply(obj, args.concat(_args))
};
}call
- 原理:鸭子模型改变调用者
1
2
3
4
5
6function call(obj = window, ...arg) {
obj.fn = this;
const res = obj.fn(...args);
delete obj.fn;
return res;
}jsonp
- 原理: 动态添加 script 标签,定义全局回调
- 回调后删除 节点以及函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22function jsonp(url, data, callBack) {
const dataString = url.indexOf('?') === -1 ? '?' : '&';
const callbackName = `jsonpCB${Date.now()}`;
url += `${dataString}callback=${callbackName}`;
const jsNode = document.createElement('script');
jsNode.url = url;
window[callbackName] = function(result) {
delete window[callbackName];
document.body.removeChild(jsNode);
callBack(result);
};
jsNode.addEventListener(
'error',
() => {
document.body.removeChild(jsNode);
delete window[callbackName];
callBack(result);
},
false
);
document.body.appendChild(jsNode);
}cookie
- cookie 属性
- maxage
- path
- domain
- secure
- cookie 属性
1 | function Cookie() { |
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick Start
Create a new post
1 | $ hexo new "My New Post" |
More info: Writing
Run server
1 | $ hexo server |
More info: Server
Generate static files
1 | $ hexo generate |
More info: Generating
Deploy to remote sites
1 | $ hexo deploy |
More info: Deployment
阿里
- 使用过的 koa2 中间件
- koa-body
- koa-route
- koa-body 原理
- 分部根据不同返回数据类型,分发不同处理器
- co-body
- 介绍自己写过的中间件
- 权限校验
- 有没有涉及到 Cluster
- 介绍 pm2
- master 挂了的话 pm2 怎么处理
- 如何和 MySQL 进行通信
- React 声明周期及自己的理解
- defaultPropus
- 如何配置 React-Router
- 路由的动态加载模块
- 服务端渲染 SSR
- 介绍路由的 history
- 介绍 Redux 数据流的流程
- Redux 如何实现多个组件之间的通信,多个组件使用相同状态如何进行管理
- 多个组件之间如何拆分各自的 state,每块小的组件有自己的状态,它们之间还有一些公共的状态需要维护, 如何思考这块
- 使用过的 Redux 中间件
- 如何解决跨域的问题
- 常见 Http 请求头
- 移动端适配 1px 的问题
- 介绍 flex 布局
- 其他 css 方式设置垂直居中
- 居中为什么要使用 transform(为什么不使用 marginLeft/Top)
- 使用过 webpack 里面哪些 plugin 和 loader
- webpack 里面的插件是怎么实现的
- dev-server 是怎么跑起来
- 项目优化
- 抽取公共文件是怎么配置的
- 项目中如何处理安全问题
- 怎么实现 this 对象的深拷贝
网易
介绍 redux,主要解决什么问题
- 事件回溯
- 跨组件数据共享
- 组件通信
文件上传如何做断点续传
表单可以跨域吗
- 可以跨域
- 表单提交完成刷行页面且不会把结果返回给 js
- 保证兼容性
promise、async 有什么区别
- promise 解决回调地域问题
- async 优雅解决异步数据返回同步处理
搜索请求如何处理(防抖)
- 保证最后一次发送有效
搜索请求中文如何请求
- url 编码
介绍观察者模式
- 发布订阅模式,订阅事件,事件触发变动后通知所有订阅着
介绍中介者模式
- 代理模式–多对多转换成一对多
观察者和订阅-发布的区别,各自用在哪里
介绍 react 优化
- this 绑定
- 构造函数 初始化
- render render 重新绑定一便
- 组件上箭头函数 重新生成函数
- shouldComponentUpdate
- 深层比较是否需要渲染,避免不必要渲染
- 定制
- 使用 Immutable
- key 优化
- 状态管理
- this 绑定
介绍 http2.0
- 二进制分帧
- 最小通信单位 分帧
- 所有帧共享 8 字节首部
- 多个帧组成消息
- 流
- 首部压缩
- 流量控制
- 多路复用
- 二进制分帧
通过什么做到并发请求
- ajax
http1.1 时如何复用 tcp 连接
介绍 service worker
介绍 css3 中 position:sticky
- 该元素并不脱离文档流,仍然保留元素原本在文档流中的位置。
- 当元素在容器中被滚动超过指定的偏移值时,元素在容器内固定在指定位置。亦即如果你设置了 top: 50px,那么在 sticky 元素到达距离相对定位的元素顶部 50px 的位置时固定,不再向上移动。
- 元素固定的相对偏移是相对于离它最近的具有滚动框的祖先元素,如果祖先元素都不可以滚动,那么是相对于 viewport 来计算元素的偏移量
Redux 请求中间件如何处理并发
介绍 Promise,异常捕获
介绍 position 属性包括 CSS3 新增
浏览器事件流向
- 事件捕获
- 是从 document 元素开始,越高级的父级元素越早接收到事件,因此这是一个从上而下的过程。
- 事件冒泡
- 相反
- 事件捕获
介绍事件代理以及优缺点
- 优点
- 可以大量节省内存占用,减少事件注册
- 可以实现当新增子对象时,无需再对其进行事件绑定,对于动态内容部分尤为合适
- 缺点
- 可能会出现事件误判。
- 优点
React 组件中怎么做事件代理
- React 并不会真正的绑定事件到每一个具体的元素上,而是采用事件代理的模式:在根节点 document 上为每种事件添加唯一的 Listener,然后通过事件的 target 找到真实的触发元素。
React 组件事件代理的原理
- 在根节点 document 上为每种事件添加唯一的 Listener,然后通过事件的 target 找到真实的触发元素。这样从触发元素到顶层节点之间的所有节点如果有绑定这个事件,React 都会触发对应的事件处理函数。这就是所谓的 React 模拟事件系统。
介绍 this 各种情况
前端怎么控制管理路由
- Hjax
- Pjax
使用路由时出现问题如何解决
React 怎么做数据的检查和变化
- 手动 setState
滴滴
- react-router 怎么实现路由切换
- react-router 里的标签和 a 标签有什么区别
- a 标签默认事件禁掉之后做了什么才实现了跳转
- history.replace 或者 history.push
- React 层面的性能优化
- 在父组件因状态的变化更改,而子组件并没有状态变化时, 不让子组件 render shouldComponentUpdate(nextProps, nextState) React.PureComponent 替换 React.Component
- 整个前端性能提升大致分几类
- import { Button } from ‘antd’,打包的时候只打包 button,分模块加载,是怎么做到的
- babel-plugin-import 把每个打包成一个
- 使用 import 时,webpack 对 node_modules 里的依赖会做什么
- JS 异步解决方案的发展历程以及优缺点
- settimneout
- 事件监听 事件驱动
- 回调函数
- promise
- Generator
- async
- Http 报文的请求会有几个部分
- cookie 放哪里,cookie 能做的事情和存在的价值
- 硬盘
- 存小数据
- cookie 和 token 都存放在 header 里面,为什么只劫持前者
- cookie 和 session 有哪些方面的区别
- React 中 Dom 结构发生变化后内部经历了哪些变化
- React 挂载的时候有 3 个组件,textComponent、composeComponent、domComponent,区别和关系,Dom 结构发生变化时怎么区分 data 的变化,怎么更新,更新怎么调度,如果更新的时候还有其他任务存在怎么处理
- key 主要是解决哪一类的问题,为什么不建议用索引 index(重绘)
- Redux 中异步的请求怎么处理
- Redux 中间件是什么东西,接受几个参数(两端的柯里化函数)
- 柯里化函数两端的参数具体是什么东西
- 中间件是怎么拿到 store 和 action,然后怎么处理
- state 是怎么注入到组件的,从 reducer 到组件经历了什么样的过程
- koa 中 response.send、response.rounded、response.json 发生了什么事,浏览器为什么能识别到它是一个 json 结构或是 html
- koa-bodyparser 怎么来解析 request
- webpack 整个生命周期,loader 和 plugin 有什么区别
- 介绍 AST(Abstract Syntax Tree)抽象语法树
- 安卓 Activity 之间数据是怎么传递的
- 安卓 4.0 到 6.0 过程中 WebView 对 js 兼容性的变化
- WebView 和原生是如何通信
- 跨域怎么解决,有没有使用过 Apache 等方案
今日头条
- 对 async、await 的理解,内部原理
- yard 的语法糖
- 介绍下 Promise,内部实现
- 清除浮动
- 定位问题(绝对定位、相对定位等)
- 从输入 URL 到页面加载全过程
- tcp3 次握手
- tcp 属于哪一层(1 物理层 -> 2 数据链路层 -> 3 网络层(ip)-> 4 传输层(tcp) -> 5 应用层 (http))
- redux 的设计思想
- 接入 redux 的过程
- 绑定 connect 的过程
- connect 原理
- webpack 介绍
- == 和 === 的区别,什么情况下用相等 ==
- bind、call、apply 的区别
- 动画的了解
- 介绍下原型链(解决的是继承问题吗)
- 对跨域的了解
有赞
- Linux 754 介绍
- 介绍冒泡排序,选择排序,冒泡排序如何优化
- transform 动画和直接使用 left、top 改变位置有什么优缺点
- 如何判断链表是否有环
- 介绍二叉搜索树的特点
- 介绍暂时性死区
- 声明只在作用域块中有效,不受外部影响
- 在声明前不可调用,会抛异常
- ES6 中的 map 和原生的对象有什么区别
- object 的键的类型是 字符串;
- map 的键的类型是 可以是任意类型;
- 观察者和发布-订阅的区别
- react 异步渲染的概念,介绍 Time Slicing 和 Suspense
- 16.X 声明周期的改变
- 16.X 中 props 改变后在哪个生命周期中处理
- 介绍纯函数
- 返回结果只依赖于参数
- 同样输入–相同返回
- 函数没有副作用
- 返回结果只依赖于参数
- 前端性能优化
- 图片选取(不同类型,大小,适用均不同,合理选取)
- 图片合并
- 懒加载
- 减少网络请求
- 图片 base64 编码
- js 异步加载
- 开启缓存
- 本地缓存
- 服务器渲染
- pureComponent 和 FunctionComponent 区别
- pureComponent 是官方实现的基本防止重复渲染的方式
- 适用于对组件包装
- FunctionComponent 直接渲染
- 适用于无状态组件
- pureComponent 是官方实现的基本防止重复渲染的方式
- 介绍 JSX
- 就是 js 与 xml 结合的一种编写方式
- 减少原生 render 编写方式
- 类似语法糖
- 最终编译成 render 方法
- 如何做 RN 在安卓和 IOS 端的适配
- RN 为什么能在原生中绘制成原生组件(bundle.js)
- 介绍虚拟 DOM
- 如何设计一个 localStorage,保证数据的实效性
- 如何设计 Promise.all()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18function all(arr){
return new Promise((resolve, reject)=>{
let len = arr.length
let result = []
let resoleAll = (idx, res)=>{
result[idx] = res
if(--len === 0){
resole(result)
}
}
arr.forEach((i,idx)=>{
i.then((res)=>{
resoleAll(idx, res)
})
})
})
} - 介绍高阶组件
- sum(2, 3)实现 sum(2)(3)的效果
1
2
3
4
5
6
7
8
9
10function curry(func, ...args){
let len = func.length
return (..._args)=>{
args = args.concat(_args)
if(args.length < len){
return curry(func, ...args)
}
return func(args)
}
} - react 性能优化
- 两个对象如何比较
挖财
- JS 的原型
- 变量作用域链
- call、apply、bind 的区别
- 防抖和节流的区别
- 介绍各种异步方案
- react 生命周期
- 介绍 Fiber
- 前端性能优化
- 介绍 DOM 树对比
- react 中的 key 的作用
- 如何设计状态树
- 介绍 css,xsrf
- http 缓存控制
- 项目中如何应用数据结构
- native 提供了什么能力给 RN
- 如何做工程上的优化
- shouldComponentUpdate 是为了解决什么问题
- 如何解决 props 层级过深的问题
- 前端怎么做单元测试
- webpack 生命周期
- webpack 打包的整个过程
- 常用的 plugins
- pm2 怎么做进程管理,进程挂掉怎么处理
- 不用 pm2 怎么做进程管理
沪江
- 介绍下浏览器跨域
- 怎么去解决跨域问题
- jsonp 方案需要服务端怎么配合
- Ajax 发生跨域要设置什么(前端)
- 加上 CORS 之后从发起到请求正式成功的过程
- xsrf 跨域攻击的安全性问题怎么防范
- 使用 Async 会注意哪些东西
- Async 里面有多个 await 请求,可以怎么优化(请求是否有依赖)
- Promise 和 Async 处理失败的时候有什么区别
- Redux 在状态管理方面解决了 React 本身不能解决的问题
- Redux 有没有做过封装
- react 生命周期,常用的生命周期
- 对应的生命周期做什么事
- 遇到性能问题一般在哪个生命周期里解决
- 怎么做性能优化(异步加载组件…)
- 写 react 有哪些细节可以优化
- React 的事件机制(绑定一个事件到一个组件上)
- 介绍下事件代理,主要解决什么问题
- 前端开发中用到哪些设计模式
- React/Redux 中哪些功能用到了哪些设计模式
- JS 变量类型分为几种,区别是什么
- JS 里垃圾回收机制是什么,常用的是哪种,怎么处理的
- 一般怎么组织 CSS(Webpack)
饿了么
- 小程序里面开页面最多多少
- React 子父组件之间如何传值
- Emit 事件怎么发,需要引入什么
- 介绍下 React 高阶组件,和普通组件有什么区别
- 一个对象数组,每个子对象包含一个 id 和 name,React 如何渲染出全部的 name
- 在哪个生命周期里写
- 其中有几个 name 不存在,通过异步接口获取,如何做
- 渲染的时候 key 给什么值,可以使用 index 吗,用 id 好还是 index 好
- webpack 如何配 sass,需要配哪些 loader
- 配 css 需要哪些 loader
- 如何配置把 js、css、html 单独打包成一个文件
- div 垂直水平居中(flex、绝对定位)
- 两个元素块,一左一右,中间相距 10 像素
- 上下固定,中间滚动布局如何实现
- [1, 2, 3, 4, 5]变成[1, 2, 3, a, b, 5]
- 取数组的最大值(ES5、ES6)
- apply 和 call 的区别
- ES5 和 ES6 有什么区别
- some、every、find、filter、map、forEach 有什么区别
- 上述数组随机取数,每次返回的值都不一样
- 如何找 0-5 的随机数,95-99 呢
- 页面上有 1 万个 button 如何绑定事件
- 如何判断是 button
- 页面上生成一万个 button,并且绑定事件,如何做(JS 原生操作 DOM)
- 循环绑定时的 index 是多少,为什么,怎么解决
- 页面上有一个 input,还有一个 p 标签,改变 input 后 p 标签就跟着变化,如何处理
- 监听 input 的哪个事件,在什么时候触发
携程
- 手写两道算法题
- 对 React 看法,有没有遇到一些坑
- 对闭包的看法,为什么要用闭包
- 手写数组去重函数
- 手写数组扁平化函数
- 介绍下 Promise 的用途和性质
- Promise 和 Callback 有什么区别
- React 生命周期
喜马拉雅
- ES6 新的特性
- 介绍 Promise
- Promise 有几个状态
- 说一下闭包
- React 的生命周期
- componentWillReceiveProps 的触发条件是什么
- React16.3 对生命周期的改变
- 介绍下 React 的 Filber 架构
- 画 Filber 渲染树
- 介绍 React 高阶组件
- 父子组件之间如何通信
- Redux 怎么实现属性传递,介绍下原理
- React-Router 版本号
- 网站 SEO 怎么处理
- 介绍下 HTTP 状态码
- 403、301、302 是什么
- 缓存相关的 HTTP 请求头
- 介绍 HTTPS
- HTTPS 怎么建立安全通道
- 前端性能优化(JS 原生和 React)
- 用户体验做过什么优化
- 对 PWA 有什么了解
- 对安全有什么了解
- 介绍下数字签名的原理
- 前后端通信使用什么方案
- RESTful 常用的 Method
- 介绍下跨域
- Access-Control-Allow-Origin 在服务端哪里配置
- csrf 跨站攻击怎么解决
- 前端和后端怎么联调
兑吧
- localStorage 和 cookie 有什么区别
- CSS 选择器有哪些
- 盒子模型,以及标准情况和 IE 下的区别
- 如何实现高度自适应
- prototype 和——proto——区别
- __construct 是什么
- new 是怎么实现的
- promise 的精髓,以及优缺点
- 如何实现 H5 手机端的适配
- rem、flex 的区别(root em)
- em 和 px 的区别
- React 声明周期
- 如何去除 url 中的#号
- Redux 状态管理器和变量挂载到 window 中有什么区别
- webpack 和 gulp 的优缺点
- 如何实现异步加载
- 如何实现分模块打包(多入口)
- 前端性能优化(1js css;2 图片;3 缓存预加载; 4 SSR; 5 多域名加载;6 负载均衡)
- 并发请求资源数上限(6 个)
- base64 为什么能提升性能,缺点
- 介绍 webp 这个图片文件格式
- 介绍 koa2
- Promise 如何实现的
- 异步请求,低版本 fetch 如何低版本适配
- ajax 如何处理跨域
- CORS 如何设置
- jsonp 为什么不支持 post 方法
- 介绍同源策略
- React 使用过的一些组件
- 介绍 Immuable
- 介绍下 redux 整个流程原理
- 介绍原型链
- 如何继承
微医
- 介绍 JS 数据类型,基本数据类型和引用数据类型的区别
- Array 是 Object 类型吗
- 数据类型分别存在哪里
- var a = {name: “前端开发”}; var b = a; a = null 那么 b 输出什么
- var a = {b: 1}存放在哪里
- var a = {b: {c: 1}}存放在哪里
- 栈和堆的区别
- 垃圾回收时栈和堆的区别
- 数组里面有 10 万个数据,取第一个元素和第 10 万个元素的时间相差多少
- 栈和堆具体怎么存储
- 介绍闭包以及闭包为什么没清除
- 闭包的使用场景
- JS 怎么实现异步
- 异步整个执行周期
- Promise 的三种状态
- Async/Await 怎么实现
- Promise 和 setTimeout 执行先后的区别
- JS 为什么要区分微任务和宏任务
- Promise 构造函数是同步还是异步执行,then 呢
- 发布-订阅和观察者模式的区别
- JS 执行过程中分为哪些阶段
- 词法作用域和 this 的区别
- 平常是怎么做继承
- 深拷贝和浅拷贝
- loadsh 深拷贝实现原理
- ES6 中 let 块作用域是怎么实现的
- React 中 setState 后发生了什么
- setState 为什么默认是异步
- setState 什么时候是同步的
- 为什么 3 大框架出现以后就出现很多 native(RN)框架(虚拟 DOM)
- 虚拟 DOM 主要做了什么
- 虚拟 DOM 本身是什么(JS 对象)
- 304 是什么
- 打包时 Hash 码是怎么生成的
- 随机值存在一样的情况,如何避免
- 使用 webpack 构建时有无做一些自定义操作
- webpack 做了什么
- a,b 两个按钮,点击 aba,返回顺序可能是 baa,如何保证是 aba(Promise.then)
- node 接口转发有无做什么优化
- node 起服务如何保证稳定性,平缓降级,重启等
- RN 有没有做热加载
- RN 遇到的兼容性问题
- RN 如何实现一个原生的组件
- RN 混原生和原生混 RN 有什么不同
- 什么是单页项目
- 遇到的复杂业务场景
- Promise.all 实现原理
寺库
- 介绍 Promise 的特性,优缺点
- 介绍 Redux
- RN 的原理,为什么可以同时在安卓和 IOS 端运行
- RN 如何调用原生的一些功能
- 介绍 RN 的缺点
- 介绍排序算法和快排原理
- 堆和栈的区别
- 介绍闭包
- 闭包的核心是什么
- 网络的五层模型
- HTTP 和 HTTPS 的区别
- HTTPS 的加密过程
- 介绍 SSL 和 TLS
- 介绍 DNS 解析
- JS 的继承方法
- 介绍垃圾回收
- cookie 的引用为了解决什么问题
- cookie 和 localStorage 的区别
- 如何解决跨域问题
- 前端性能优化
宝宝树
- 使用 canvas 绘图时如何组织成通用组件
- formData 和原生的 ajax 有什么区别
- 介绍下表单提交,和 formData 有什么关系
- 介绍 redux 接入流程
- rudux 和全局管理有什么区别(数据可控、数据响应)
- RN 和原生通信
- 介绍 MVP 怎么组织
- 介绍异步方案
- promise 如何实现 then 处理
- koa2 中间件原理
- 常用的中间件
- 服务端怎么做统一的状态处理
- 如何对相对路径引用进行优化
- node 文件查找优先级
- npm2 和 npm3+有什么区别
海康威视
- knex 连接数据库响应回调
- 介绍异步方案
- 如何处理异常捕获
- 项目如何管理模块
- 前端性能优化
- JS 继承方案
- 如何判断一个变量是不是数组
- 变量 a 和 b,如何交换
- 事件委托
- 多个标签生成的 Dom 结构是一个类数组
- 类数组和数组的区别
- dom 的类数组如何转成数组
- 介绍单页面应用和多页面应用
- redux 状态树的管理
- 介绍 localstorage 的 API
蘑菇街
- html 语义化的理解
- b 和 strong 的区别
- 对闭包的理解
- 工程中闭包使用场景
- 介绍 this 和原型
- 使用原型最大的好处
- react 设计思路
- 为什么虚拟 DOM 比真实 DOM 性能好
- react 常见的通信方式
- redux 整体的工作流程
- redux 和全局对象之间的区别
- Redux 数据回溯设计思路
- 单例、工厂、观察者项目中实际场景
- 项目中树的使用场景以及了解
- 工作收获
酷家乐
- react 生命周期
- react 性能优化
- 添加原生事件不移除为什么会内存泄露
- 还有哪些地方会内存泄露
- setInterval 需要注意的点
- 定时器为什么是不精确的
- setTimeout(1)和 setTimeout(2)之间的区别
- 介绍宏任务和微任务
- promise 里面和 then 里面执行有什么区别
- 介绍 pureComponet
- 介绍 Function Component
- React 数据流
- props 和 state 的区别
- 介绍 react context
- 介绍 class 和 ES5 的类以及区别
- 介绍箭头函数和普通函数的区别
- 介绍 defineProperty 方法,什么时候需要用到
- for..in 和 object.keys 的区别
- 介绍闭包,使用场景
- 使用闭包特权函数的使用场景
- get 和 post 有什么区别
百分点
- React15/16.x 的区别
- 重新渲染 render 会做些什么
- 哪些方法会触发 react 重新渲染
- state 和 props 触发更新的生命周期分别有什么区别
- setState 是同步还是异步
- 对无状态组件的理解
- 介绍 Redux 工作流程
- 介绍 ES6 的功能
- let、const 以及 var 的区别
- 浅拷贝和深拷贝的区别
- 介绍箭头函数的 this
- 介绍 Promise 和 then
- 介绍快速排序
- 算法:前 K 个最大的元素
海风教育
- 对 react 看法,它的优缺点
- 使用过程中遇到的问题,如何解决的
- react 的理念是什么(拿函数式编程来做页面渲染)
- JS 是什么范式语言(面向对象还是函数式编程)
- koa 原理,为什么要用 koa(express 和 koa 对比)
- 使用的 koa 中间件
- ES6 使用的语法
- Promise 和 async/await 和 callback 的区别
- Promise 有没有解决异步的问题(promise 链是真正强大的地方)
- Promise 和 setTimeout 的区别(Event Loop)
- 进程和线程的区别(一个 node 实例就是一个进程,node 是单线程,通过事件循环来实现异步)
- 介绍下 DFS 深度优先
- 介绍下观察者模式
- 观察者模式里面使用的数据结构(不具备顺序 ,是一个 list)
Docker进阶与实战 (容器技术系列)
引入概念
docker 客户端
通过命令行访问
开发过程通过 restfullapi 进行访问
概述为提供docker 访问的一系列工具以及 api
docker daemon
可理解为 docker server
也就是 docker运行引擎
提供外部访问接口响应访问结果的服务引擎
docker 容器
容器以镜像为基础,同时为镜像提供一个标准和隔离的执行环境
docker 镜像
运行环境的物理资源
层级可复用 减小磁盘开销
通过Dockerfile 定制镜像
docker commit 生成镜像
registry
远程镜像仓库,提供镜像的管理下载服务器
容器
- 容器组成
- cgroup 资源控制
- 用于隔离进程对资源的使用
- namespace 访问隔离
- rootfs 文件系统隔离
- 容器引擎 生命周期控制
镜像
- 常用操作
- docker images
- docker pull
- docker save -o name src
- docker load -i name
- docker import 导入文件生成镜像
- docker export 导出文件
- docker commit 增量生成镜像
- docker build 通过dockerfile 生成镜像
- docker ship
- docker run 运行容器
- docker ps 列出容器
- docker inspect 列出容器和镜像详细信息
js部分
js 基础
基本类型
- 原始类型(值传递)
- string
- number
- null
- undefined
- boolean
- symbol
- 对象(地址传递)
- 函数(地址传递)
- 原始类型(值传递)
类型判断
- typeOf
- 除了 null 其他都能是正确类型
- 除原始类型以及函数外都是 object
- instanceOf
- 不能正确处理原始类型
- 原型连
- 不能准确判断类型
- typeOf
类型转换
- 转换布尔值
- 除 null undefined 空窜 0 false NaN 都是 true
- 转换数字
- 空数组 0 数组只有一个数值 转换为数值
- 空字符串 0
- 对象 转化为 NaN
- “1”–> 1 Object –> NaN true –> 1 false –> 0 Null –> 0 “any”–> NaN
- 转换字符串
- Object –> [Object Object] Array –> Array.join(‘,’)
- 对象转换为 原始类型
- 判断 valueOf() 是否转化为原始类型 如果不是调用 toString() 方法
- 所以 空数组转换为 0 情况
- 加法转换
- 如果一方为字符串 另一方也会转换为字符串
- 如果不是字符串或则数值会通过 转化为原始类型顺序处理
- 比较转换
- === 基础类型不进行转换 直接比较,任意一个条件不满足就是不同
- == 进行以下转换(转换为相同类型再进行比较)
- 都是对象则地址比较
- 一方为原始类型则另一方转换为原始类型比较
- 编码比较 unicode
- 转换布尔值
this
- 指向调用函数
- 指向apply函数
- 指向bind函数(只能绑定一次)返回闭包
闭包
- 一个函数可访问另一函数作用域内的局部变量
拷贝
- 深拷贝
JSON处理
- 因为转换成字符串,所以 undefined function symbol 无法复制 循环引用处理不来
MessageChannel 可以处理不包含函数的 对象深拷贝
1
2
3
4
5
6
7
8
function deepClone(obj){
return new Promise((resolve)=>{
const {port1, port2} = new MessageChanel()
port1.onmessage = msg=> resolve(msg.data)
port2.postMessage(obj)
})
}deepCopy
- 浅拷贝(只拷贝一层)
- Object.assign() 展开符
- Array.slice()
- 深拷贝
原型链
- 多个对象通过__proto__ 链接起来
- child.proto = 构造函数.prototype = 原型;原型.proto = 父级原型;原型.constructor = 构造函数
- 原型的 constructor 属性指向构造函数,构造函数又通过 prototype 属性指回原型
- Function.proto.constructor === Function === Function.prototype
- 对象里有_proto_这个属性。它指向原型,由它连接对象和原型组成原型链,同时原型里又有prototype属性,该属性里有一个constructor又指向回对象的构造函数形成一个闭环
模块化
- 优点
- 解决命名冲突
- 提高复用性
- 提高可维护性
- amd
- 依赖前置
- 先加载所有模块
- cmd
- 依赖后置
- 需要时引用
- CommonJS
- module.exports === exports
- exports 是module.exports的引用,不可直接赋值
- 优点
setInterval通常来说不
- 建议使用 setInterval。第一,它和 setTimeout 一样,不能保证在预期的时间执行任务。第二,它存在执行累积的问题,请看以下伪代码
事件循环
- macroTask(jobs)
- 宏任务 script , setTimeout ,setInterval ,setImmediate ,I/O ,UI rendering
- microTask(task)
- 微任务 process.nextTick ,promise ,MutationObserver
- 6个阶段
- timer 执行 setTimeout 与 setInterval
- io 执行 I/O 操作
- idle, prepare
- poll
- 回到 timer 阶段执行回调
- 执行 I/O 回调
- macroTask(jobs)
手写bind
1
2
3
4
5
6
7
8
9
10function bind(){
const _this = this
const args = Array.from(arguments).slice()
return function F(){
if(this instanceOf F){
return new _this(...args, ...arguments)
}
_this.apply(args.shift(), args.concat(arguments))
}
}
- 简单记录
- 长按
- 懒加载