随笔分类 - javascript
摘要:在看 js 事件循环的时候,看到一个有趣的 promise then 执行顺序的题,想了好久,终于想明白了,这里记录一下。 大家先想下这里的执行顺序是什么。 new Promise(resolve => { // 1 setTimeout(()=>{ // 2 console.log(666); /
阅读全文
摘要:window.event 是一个由微软 IE 引入的属性,只有当 DOM 事件处理程序被调用的时候会被用到。它的值是当前正在处理的事件对象。 据实际测验发现,window.event 在异步事件触发的时候,才会有值,否则为 undefined,且在一个事件循环之中,如果下一个宏任务开始,下一个宏任务
阅读全文
摘要:document.activeElement获取当前获得焦点的元素: IE:document.activeElement可获得所有聚焦的元素,包括input、textarea、div等。IE只关心光标聚焦的位置,不关心聚焦元素的性质。 chrome:document.activeElement仅对i
阅读全文
摘要:概念 performance.now():返回值表示为从time origin之后到当前调用时经过的时间, time origin: 时间源, 时间源是一个可以被认定为当前文档生命周期的开始节点的标准时间,计算方法如下: 如果脚本的 global object 是 Window, 则时间源的确定方式
阅读全文
摘要:概念 window.requestIdleCallback() 方法插入一个函数,这个函数将在浏览器空闲时期被调用。这使开发者能够在主事件循环上执行后台和低优先级工作,而不会影响延迟关键事件,如动画和输入响应。函数一般会按先进先调用的顺序执行,然而,如果回调函数指定了执行超时时间timeout,则有
阅读全文
摘要:概念 Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回
阅读全文
摘要:LFU 算法 /** * @param {number} capacity */ var LFUCache = function (capacity) { this.map = new Map();// 存放 key:node 的索引,便于快速访问节点 this.freqArr = new Arra
阅读全文
摘要:// pid 代表属于的父级 id // id 代表的是自己本身的id,本身的 id 是多少 let flatArr = [ { id: 1, name: "部门1", pid: 0 }, { id: 2, name: "部门2", pid: 1 }, { id: 3, name: "部门3", p
阅读全文
摘要:// 计数排序 // 稳定性:稳定 // 定义一个数组,将数组中每个元素出现的次数以数组形式保存起来,数组索引值即为具体 key,数组索引对应的元素值即为该索引值出现的次数 // 再将保存起来的次数的数字依次放入原数组 function countingSort(arr, maxValue) { l
阅读全文
摘要:// 插入排序的原理: // 一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。 // 插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、长度数增 1 的有序表。在其实现过程使用双层循环,外层循环从第二个元素开始遍历,代表执行多少
阅读全文
摘要:// 选择排序 // 原理:进行 n-1 趟 循环,每趟循环中遍历所有未排好序的数,第一趟循环,从第0个元素开始向后遍历,找到 最小的元素,与第1 一个元素进行交换,第二趟,从第 1 个元素开始向后遍历,找到最小值与第2个元素 进行交换,以此类推 // 从而得出规律,每次遍历元素开始位置为 i+1,
阅读全文
摘要:// 冒泡排序 // 原理就是每一轮循环,将一个最大的值冒泡到最后 // 1.每一趟都是比较相邻两个元素,如果前一个元素大于后一个,则交换两个元素 // 2.第一趟从第一个元素开始进行交换,最后一个元素不参与交换,第二趟最后两个元素不参与交换......以此类推,所以第二层循环要将数组的长度-1-i
阅读全文
摘要:js 创建二维数组的方法: 方法一: 直接设置 let arr = [ [1, 2], [3, 4], [5, 6], ]; let arr = [] ; arr[0] = [1,2,3,4,5,6]; arr[1] = [10,20,30,40,50,60] 方法二: fill + 一个 for
阅读全文
摘要:// 解析获取的 url 中的参数为对象 function parseQueryString(url) { if (!url) { return {}; } const qsArr = decodeURIComponent(url).split("?")[1].split("&"); return
阅读全文
摘要:substr 和 substring 都为截取字符串部分字符 substr(start, length) , 第一个参数为起始位置,第二个参数为从起始位置开始截取的长度 第一个参数可为负数 substring(start,end),第一个参数和第二个参数分别为起始位置和结束位置,截取的字符串不包括结
阅读全文
摘要:看了一些编译原理的博文,对词法和语法的理解: 词法:是对一堆代码的一种提取,语法:是理解提取后的代码分别代表了什么意思,并赋予对应的意义,从而构建 AST 抽象语法树。
阅读全文
摘要:// keyBy function keyBy(list, by) { return list.reduce((acc, x) => { acc[by(x)] = x; return acc; }, {}); } console.log( keyBy( [ { id: 1, name: "beile
阅读全文
摘要:// 几个要素: // 1.维护一个 events 对象 // 2.对象上每个事件为 key,值为事件执行函数,为数组 // 3.维护三个方法: // 触发事件:emit,执行事件所绑定的方法(on绑定的) // 监听事件:on,哪里需要在监听到事件的时候执行一些动作,就在那里绑定,可能有多个待执行
阅读全文
摘要:// 无限累加 sum // 一共做两件事: // 1. 调用一次返回当前计算函数本身,该函数主要作用之一为合并多次调用传的不同数量的参数 // 2. 给返回的函数增加 valueOf 最终计算结果的方法 function sum(...args) { // 定义返回的闭包函数 const f =
阅读全文
摘要:// add 异步相加 function add(a, b) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(a + b); }, 1000); }); } // 传入不定长度的数组,与 add 函数,对数
阅读全文