yelin1994
yelin1994
``` function getMidPointNumber (arr1, arr2) { const result = [] const len1 = arr1.length const len2 = arr2.length let i = 0 let j = 0 let count = 0...
## Promise.all 的实现 思量了半天,原生的Promise 无法一时写出来 这边稍微利用下Promise来实现 Promise.all ``` Promise.all = arr => { const results = [] return new Promise(resolve => { let i =0; function next () { arr[i]...
## BFC 块级格式化上下文,其中W3C 对其的定义如下: 浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions),以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的BFC(块级格式上下文)。 从另一个角度来理解的话,BFC 是一个独立的布局环境,其中的元素布局是不受外界影响的。且其中的块盒和行盒(内联元素组成),都会沿着父元素的边框垂直排列 BFC满足以下条件的一个或者多个 * position 为absolute * float 不为none * display 为inline-block, inline-flex, flex等 * overflow 不为visible ### BFC的创建 只要满足上述的几个条件即可创建成功 ###...
--- ## 寄生组合继承 ``` function CreateDog(obj) { function Dog () { } Dog.prototype = obj return new Dog() } function Animal () { this.type = ['aniaml'] } Animal.prototype.sayType = function...
## 浏览器事件代理机制 ### 事件流 事件流描述的是从页面中接受事件的顺序。分为事件捕获和事件冒泡。 * 事件冒泡: 时间开始时由最具体的元素接受,逐级向上传播, 当上级也有类似事件(click, onmouseOver等)也会跟着触发,可用stopPropagation 可以阻止冒泡和捕获进一步触发。顺便说一下,preventDefault 是阻止默认事件。 * 事件捕获: 事件会从最外层开始发生,知道最具体的元素,也就是说假如父元素与子元素都绑定点击事件,那么最先发出的是父元素的时间,然后再传递到子元素 addEventListeb(event, function, useCapture), 第三个参数默认为false, 即使用时间冒泡,若为true则使用事件捕获的机制。 ### 事件代理 通俗来讲是将元素的事件函数处理交由其他对象处理。它允许您避免向特定节点添加事件侦听器,我们这里所谈论的事件委托,与冒泡捕获流程相关,因此事件委托在此场景指的是子对象的处理事件交由父对象处理。 好像很多博客都是举的ul和li的例子: ``` 1 2 3 4 5...
## 构造函数和组合继承 ``` function Animal () { this.type =['origin'] } Animal.prototype.tellOrigin = function () { console.log(this.type) } function Dog () { this.ownType = 'dog' Animal.call(this) } const dog = new...
## 闭包问题 ### 定义 你不知道的js 书是这样定义的:当函数可以记住并访问所在的词法作用域时就产生的了闭包,即使函数是在当前词法作用域之外执行。 ``` function foo() { var a = 2 function bar() { console.log(a) } return bar } var baz = foo() ``` bar 能使foo的内部作用域不会在foo()执行后立即被销毁,会一直存活,以便bar() 后续进行使用。
## setTimeout 倒计时为啥会出现误差 说道这个问题,可以先了解下javascript 的事件循环 ### 事件循环 js 是单线程。为了不让某个耗时比较长的任务,比如aajax请求,让引擎一直等待返回才执行其他任务,一般将任务分为同步任务和异步任务。 * 当任务进入执行栈的时候,同步任务和异步任务会进入不同的执行场所,同步会进入主线程,异步的进入事件表,并注册函数。 * 当异步任务返回时,该任务会进入事件队列。 * 当主线程的任务完成时,才会去事件队列读取对应的函数,进入主线程执行 * 上述过程,不断重复。形成了事件循环 Js 引擎存在管理进程的进程,会一直不停检查主线程。一旦为空就会去读取事件队列的任务。 而setTimeout 刚好是异步进程,他的执行往往要等主线程,才会去从事件队列,调用setTimeout的回调函数,所以也就导致,会与自己写的延迟时间不相符合。 进一步说一下, 任务还可以微任务和宏任务。 * macro-task(宏任务):包括整体代码script,setTimeout,setInterval * micro-task(微任务):Promise,process.nextTick 事件循环的顺序,决定js代码的执行顺序。进入整体代码(宏任务)后,开始第一次循环。接着执行所有的微任务。然后再次从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务。 参考:https://juejin.im/post/59e85eebf265da430d571f89
## 数组去重 * 采用集合的方式 ``` var a = [1, 2, 1, 3, 2] var b = new Set(a) // Set(3){1,2,3} var c = Array.from(b)// [1, 2, 3] ``` 但当数组元素是引用类型的时候,则无法去重 *...
## 可迭代对象有什么特点 ### 遍历器(Interator) 定义: 他是一种接口, 为各种不同的数据结构提供统一的访问机制。 任何数据只要部署interator接口,就可以完成遍历操作。其主要供for...of 消费。(w3c定义) 遍历过程: * 创建一个指针对象,指向当前数据结构的起始位置。 * 不断调用指针对象的next方法,直到他指向数据结构结束的位置。 ``` function createIterator (items) { var i = 0 return { next: function () { var...