Promise总结
ES6 异步模型
Promise 是异步编程的一种解决方案,它由社区最早提出和实现,ES6 将其写进了语言标准,原生提供了 Promise 对象。
一件可能发生异步操作的事情,分为两个阶段:unsettled 和 settled
unsettled: 未决阶段,表示事情还在进行前期的处理,并没有发生通向结果的那件事
settled:已决阶段,事情已经有了一个结果,不管这个结果是好是坏,整件事情无法逆转
事情总是从未决阶段逐步发展到已决阶段的,并且未决阶段拥有控制何时通向已决阶段的能力
一件异步的事情被划分为三种状态: pending、fulfilled、rejected
pending:处于未决阶段,则表示这件事情还在挂起,最终的结果还没出来
fulfilled:已决阶段的一种状态,是一个可以按照正常逻辑进行下去的结果
rejected:已决阶段的一种状态,是一个无法按照正常逻辑进行下去的结果,通常用于表示有错误
把事情推向 fulfilled 状态的过程叫做:resolve,推向 rejected 状态的过程叫做:reject
将事情从 pending 推 ...
mongodb总结
基础概念
mongodb 的特点:
nosql数据库
无sql语句
使用极其简单,学习成本非常低
由于没有集合之间的关联,难以表达复杂的数据关系
存取速度极快
文档型数据库
数据内容非常丰富和灵活
对数据结构难以进行有效的限制
基础概念:
db:和mysql的概念一致
collection:集合,类似于mysql中的表
document:每个集合中的文档,类似于mysql中的记录
Primary Key:和mysql中的主键含义一致,每个document都有一个主键
field:文档中的字段
常用命令
查看所有数据库:
1show dbs;
显示当前使用的数据库:
1db;
查看当前数据库状态:
1db.stats()
查看数据库中所有的集合:
1show collections;
切换数据库:
1use db;
备份:
1mongodump -d <dbname> -o <backupDir>
恢复
1mongorestore -d <dbname> <backupDir>
...
AVL树
平衡二叉搜索树
在理想情况下,二叉搜索树添加、删除、搜索的时间复杂度为 logn 级别,但是二叉搜索树的结构依赖于添加的顺序。最糟糕的情况会让一棵二叉搜索树退化成一个链表。
对于7、4、9、2、5、8、11这样的数据,构造出来的二叉搜索树是这样的:
但是如果数据添加的顺序不是按照这个顺序而是按照从大到小/从小到大的顺序,那么就会退化成一个链表。
对于二叉搜素树来说,由于数据添加的顺序决定了树的结构,所以很难达到理想情况。
平衡: 所谓的平衡就是左右子树的高度接近。左右子树高度越接近,二叉树越平衡。
最理想的平衡就是像完全二叉树那样,高度是最小的。
在二叉搜索树的添加、删除之后做一些操作,来减小树的高度,让树变平衡一些。
AVL树
AVL树是最早发明的平衡二叉搜索树之一。
平衡因子
平衡因子是AVL树中一个比较重要的概念,它是指树中某个节点的左右子树的高度差,通常我们用左子树减去右子树。
AVL树对平衡因子的要求:每个节点的平衡因子只能为 -1,0,1。
这意味着每个节点的左右子树的高度差不能超过1,超过就意味着失去平衡需要调整。
AVL树节点定义
12345678910111 ...
redux原理
redux 总结
redux 是前端的一种数据解决方案。redux 由三部分组成,action、reducer 和 store。
其中 store 用于保存数据,action 用来描述如何改变数据,reducer 是用于改变数据的处理函数。
三者间的关系:
action
必须是一个 plain-object
通常,使用 payload 属性表示附加数据
action 中必须有 type 属性,描述操作的类型,该属性可以是任何类型
action 创建函数
为了方便传递 action,通常会使用 action 创建函数来创建 action
action 创建函数应为纯函数
bindActionCreators
为了方便利用 action 创建函数来分发 action
参数 1:action 创建函数 / action 创建函数集合(对象)
参数 2:store.dispatch
返回值:增强的 action 创建函数,创建后自动分发
reducer
reducer 是一个接收两个参数:state 和 action 的函数
reducer 被调用的时机: ...
webpack中的性能优化
构建性能
这里所说的构建性能,是指在开发阶段的构建性能,而不是生产环境的构建性能。
优化的目标,是降低从打包开始,到代码效果呈现所经过的时间。
减少模块解析
模块解析包括:抽象语法树分析、依赖分析、模块依赖函数替换。
如果没有模块解析打包过程就是这样的:
如果不解析某个模块,该模块经过loader处理后的代码就是最终代码,如果没有loader对该模块进行处理,该模块的源码就是最终打包结果的代码。
对于那些已经打包好了的第三方库,可以使用这种方式,缩短构建时间。例如:jquery,它的 package.json 中main字段指向的就是已经打包好的文件。
开启方式:配置 module.noParse,被正则匹配到的模块不会解析。
优化loader性能
限制loader的应用范围
对于某些库,不使用loader,因为没有必要。例如:babel-loader可以转换ES6或更高版本的语法,可是有些库本身就是用ES5语法书写的,不需要转换,使用babel-loader反而会浪费构建时间。
通过 module.rule.exclude 或 module.rule.include,排除或 ...









