Node事件循环
Node事件循环 当 Node.js 启动后,它会初始化事件循环,处理已提供的输入脚本,它可能会调用一些异步的 API、调度定时器,或者调用 process.nextTick(),然后开始处理事件循环。 事件循环分为六个阶段,每个阶段都有一个 FIFO 队列来执行回调。 通常情况下,当事件循环进入给定的阶段时,将执行该阶段队列中的回调,直到队列用尽或最大回调数已执行。当该队列已用尽或达到回调限制,事件循环将移动到下一阶段。 阶段概述 timers:本阶段执行已经被 setTimeout() 和 setInterval() 的调度回调函数。 pending:系统级回调 idle, prepare:仅系统内部使用 poll:执行与 I/O 相关的回调(除了关闭的回调函数,那些由计时器和 setImmediate() 调度的之外的几乎所有回调) check:setImmediate() 回调函数在这里执行。 close:一些关闭的回调函数,如:socket.on('close', ...)。 在每次运行的事件循环之间,Node.js 检查它是否在等待任何异步 I/O 或计时器,如果 ...
JavaScript中的继承
原型 JavaScript 是基于对象的,函数也是一个对象。JavaScript 中的每一个函数/类都有一个 prototype 属性,它定义了构造函数制造出的对象的公共祖先。在它上面定义的属性和方法可以被对象实例共享。 默认情况下,所有原型对象自动获得一个名为 constructor 的属性,指回与之关联的构造函数。 12function Test { }console.log(Test.prototype.constructor === Test); // true 每个对象都有一个内部属性 [[Prototype]],也被称为隐式原型。 该属性指向构造函数的原型。js 中没有访问 [[Prototype]] 的标准方式,但 Firefox、Safari 和 Chrome 会在每个对象上暴露 __proto__ 属性。 默认通过对象字面量创建的对象隐式原型指向 Object.prototype,相当于通过 new Object() 创建。 在 Chrome 控制台,一个对象的隐式原型的 constructor 为什么函数/类,这个对象就会显示为什么类型。 ...
JavaScript执行上下文
执行上下文 当控制权转移到ECMAScript可执行代码时,控制权正在进入执行上下文。活动执行上下文在逻辑上形成一个堆栈。此逻辑堆栈顶部的执行上下文是运行中的执行上下文。 执行上下文(execution context) 指的就是一段代码运行的环境。 调用栈由执行上下文组成,所以在JavaScript中执行上下文就是所谓的栈帧,调用栈的顶部是正在运行的代码的执行上下文,底部是全局的执行上下文。 变量对象 可执行代码类型: 全局代码 eval 代码 函数代码 根据 ES3 文档,执行上下文中的内容包括: variable object scope chain this 全局对象 也就是 globalThis,在浏览器端就是 window,node 就是 global,全局对象包含了 ECMAScript 的内置对象,和宿主环境定义的附加属性。 全局对象在进入任何执行上下文之前被创建,全局对象也是全局的 VO,即所谓的 GO。 变量对象 当进入一个函数的执行上下文时,会创建一个变量对象并和该执行上下文相关联,并使用一个名为 arguments 的属性初始化该对象。 变量对象 ...
Promise/A+规范以及简单实现
Promise A+ 规范 术语 Promise:promise 是一个拥有 then 方法的对象或函数,其行为符合本规范; thenable:是一个定义了 then 方法的对象或函数,文中译作“拥有 then 方法”; value:指任何 JavaScript 的合法值(包括 undefined , thenable 和 promise); exception:是使用 throw 语句抛出的一个值。 reason:表示一个 promise 的拒绝原因。 要求 Promise 的状态 一个 Promise 的当前状态必须为以下三种状态中的一种:Pending、Fulfilled和Rejected。 等待态(Pending) 处于等待态时,promise 需满足以下条件: 可以迁移至执行态或拒绝态 执行态(Fulfilled) 处于执行态时,promise 需满足以下条件: 不能迁移至其他任何状态 必须拥有一个不可变的终值 拒绝态(Rejected) 处于拒绝态时,promise 需满足以下条件: 不能迁移至其他任何状态 必须拥有一个不可变 ...
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 被调用的时机: ...