![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JS核心
AvengerDrJ
I promise
展开
-
js堆排序详解
一. 堆的概念堆是一棵顺序存储的二叉树大根堆(大顶堆):其中每个节点的值都不小于其子节点小根堆(小顶堆):其中每个节点的值都不大于其子节点二. 堆排序的过程创建堆调整堆选取最值再次调整堆三.代码实现let arr = [9, 1, 2, 8, 7, 3, 4, 6, 5]function swap(arr, i, j){ let temp = arr[i] arr[i] = arr[j] arr[j] = temp}function BuildHeap(原创 2021-09-05 21:11:04 · 1107 阅读 · 0 评论 -
ES6-Map和Set对象以及Iterator
1.Iterator对象主要功能:为各种数据结构,提供一个统一的,简便的访问接口。使得数据结构的成员能够按某种次序排列,是有序的。是 ES6 创造了一种新的遍历命令 for…of 循环,Iterator 接口主要供 for…of 消费。使用方法如果有 Iterator 对象,则可以使用 next 方法进行遍历,就像一个指针,会按顺序指向下一项2.set对象let set = new Set( [1, 1, 2, '3', '3', true, true, {1:1}, {1:1}]原创 2021-07-26 11:19:48 · 187 阅读 · 0 评论 -
js中for in和for of详解
for…in 和 for…of 区别,以及使用for…of 的特性for…of 需要有 iterator 的支持才能进行遍历。有 iterator 支持的数据结构有:Array Map Set String 函数的arguments对象 NodeList对象object 对象不可以,因为 object 中的属性没有先后顺序,但是可以主动添加 iterator 属性如何添加 iterator 属性,在对象中添加 “Symbol.iterator” 属性,就可以使用 for…of 遍历了凡是部署了原创 2021-07-21 09:34:02 · 404 阅读 · 0 评论 -
defineProperty和Proxy的区别
1.proxy 的用法,defineProperty 的用法const myProxy = new Proxy(target, handle)// target: 使用proxy包装的目标对象// handle: 用来制定拦截行为Object.defineProperty(obj, prop, descriptor)// obj: 必需。目标对象 // prop: 必需。需定义或修改的属性的名字// descriptor: 必需。目标属性所拥有的特性 (writable:可重写 e原创 2021-06-27 15:59:12 · 1008 阅读 · 0 评论 -
JS手写发布订阅
手写发布订阅class pubSub { constructor(){ this.list = {} } // 订阅 subscribe(key, fn) { if (!this.list[key]) { this.list[key] = [] } this.list[key].push(fn) } // 发布 publish(key, ...args) {原创 2021-02-17 18:53:05 · 514 阅读 · 1 评论 -
JS手写call,apply,bind
1.手写call,apply,bind//callFunction.prototype.myCall = function(context){ context = context || window context.fn = this let arg = [...arguments].slice(1) let result = context.fn(...arg) delete context.fn return result}//applyFun原创 2020-12-09 17:16:50 · 96 阅读 · 0 评论 -
js 转化boolean值问题
1.转化为boolean值时,出现的问题在js中, false null 0 “” undefined NaN 被称为假值如果Boolean构造函数的参数不是一个布尔值,则该参数会被转换成一个布尔值如果参数上面的假值,就会自动转化为 false其他任何值,任何对象包括空对象{} 或者 字符串’false’ 或者只有空格的字符串 " ",都会转化为 truevar a1 = new Boolean()var a2 = new Boolean(0)var a3 = new Boole原创 2020-12-05 12:31:37 · 172 阅读 · 0 评论 -
IE兼容,盒模型,默认/冒泡事件
1.IE 盒模型与标准盒模型盒模型的组成,由里向外分别是 content,padding,border,margin标准盒模型:内容大小就是content的大小 ( (margin + padding + border) * 2 + width )IE盒模型: 内容大小是 content,padding,border总的大小 ( margin * 2 + width )通过设置 box-sizing: content-box(W3C) / border-box(IE) 就可以达原创 2020-11-26 14:43:29 · 176 阅读 · 0 评论 -
JS构造函数返回值问题
1.js构造函数返回值问题构造函数本不应该,不需要有返回值,实际执行的返回值就是此构造函数的实例化对象但是在 js 中构造函数可以有返回值也可以没有,没有时,和正常的构造函数一样,返回实例化对象返回值是非引用类型,如基本类型(string,number,boolean,null,undefined)则与无返回值相同返回值是是引用类型,则实际返回值为这个引用类型,就会出现问题注意:构造函数中的 this 指向实例化的对象,所以构造函数通过 this 给实例添加属性和方法function foo原创 2020-11-19 23:14:25 · 1560 阅读 · 0 评论 -
JS原型链总结,箭头函数的坑
1. JS 原型链是什么?有时候很多对象会有共同的方法和属性,不可能让每一个对象都定义一个属性,那样太消耗内存了原型链上的所有节点都是对象,不能是字符串、数字、布尔值等原始类型注意:只有函数才有 prototype (函数也是一个对象), 实例只有 proto函数是 Function 的实例, 函数的 prototype 是 Object 的实例 (关键)Object.prototype.proto 指向 null实例化对象的 constructor 属性指向 构造函数 本身fun原创 2020-11-09 22:19:24 · 477 阅读 · 0 评论 -
async await用法及原理总结
1.Async Await 原理(注:await 只能出现在 async 函数中)当调用一个 async 函数时,会返回一个 Promise 对象 (关键)async 函数中可能会有 await 表达式,await表达式 会使 async 函数暂停执行,直到表达式中的Promise解析完成后继续执行 async 中 await 后面的代码并返回解决结果。既然返回的是Promise 对象,所以在最外层不能直接获取其返回值,那么肯定可以用原来的方式:then() 链来处理这个 Promise 对象原原创 2020-11-09 21:47:08 · 15981 阅读 · 0 评论 -
ES6-generator用法及原理
1.Generator原理Generator 函数,是可以暂停执行的,函数名之前要加’*’。其实整个 Generator 函数就是一个封装的异步任务,或者说是异步任务的容器yield 异步操作需要暂停的地方next 方法的作用是分阶段执行 Generator 函数。每次调用 next 方法,会返回一个对象,这个对象就是具有两个属性value:yield 语句后面表达式的值,表示当前阶段的值done:是一个布尔值,表示 Generator 函数是否执行完毕。说明了Generator 函数可以暂停原创 2020-11-09 20:46:33 · 496 阅读 · 0 评论 -
函数声明提升与变量声明提升
1.函数声明提升与变量声明提升// 因为变量提升的优先级 function 高于 var,最后都输出 numberfunction fn(){ console.log(typeof a) // function (function先提升,然后var提升,但是a已经声明是个函数,不能重复声明) var a = 0 function a(){} console.log(typeof a) // number (但是后来把 0 赋值给 a,原创 2020-11-08 23:35:28 · 108 阅读 · 0 评论 -
js new方法的简单实现
1.手写 new 方法function myNew(){ // 创建一个空对象 const obj = {} // 将参数中第一个(第一个参数就是构造函数)拿出来定义 const Constructor = Array.prototype.shift.call(arguments) // 将构造函数的prototype属性赋值给实例对象的__proto__ obj.__proto__ = Constructor.prototype // 判断构造函数原创 2020-11-02 21:12:34 · 135 阅读 · 0 评论 -
Node EventEmitter简单实现
1.Node中的事件模块Node的事件模块只包含了一个类:EventEmitter。这个类在node的内置模块和第三方模块中大量使用。EventEmitter,用于监听一些事件,并且处理,本质上是一个观察者模式的实现2.EventEmitter基本使用方式const events = require('events')const emitter = new events.EventEmitter()function fn1(name){ console.log("fn1",name)}原创 2020-11-02 20:36:47 · 132 阅读 · 0 评论 -
JS继承的方式总结
继承的几种方式?实现原理?父类定义function Animal (name) { // 属性 this.name = name || 'Animal' // 实例方法 this.sleep = function(){ console.log(this.name + '正在睡觉!') }}// 原型方法Animal.prototype.eat = function(food) { console.log(this.name + '正在吃:' + food)}原创 2020-10-30 18:43:42 · 189 阅读 · 1 评论 -
JS parseInt的用法
parseInt的用法// parseInt(string,raix)函数有两个参数// 第一个参数:被检测的字符串或数字// 第二个参数:指的就是进制,默认为10进制,不在范围[2,36]内,返回 NaN // 1. 解析字符串从第一个字符开始直到不是数字的字符部分// 2. 如果字符串中第一个字符就不是数字,那么返回 NaN // 3. 如果第一个参数使用了0x表示十六进制,那么第二个参数设置了值也无效console.log(parseInt('123')) // 123console原创 2020-10-30 13:14:40 · 536 阅读 · 0 评论 -
立即执行函数总结
1.立即执行函数是什么立即执行函数的两种常见形式:( function(){} )():一个是一个匿名函数包裹在一个括号运算符中,后面再跟一个小括号( function(){}() ):另一个是一个匿名函数后面跟一个小括号,然后整个包裹在一个括号运算符中,这两种写法是等价的。要想立即执行函数能做到立即执行,要注意两点,一是函数体后面要有小括号(),二是函数体必须是函数表达式而不能是函数声明。2.立即执行函数笔试题// 第一个是输出 1 是因为 foo 作为参数传入进去有值// 第二个是因为原创 2020-10-29 14:57:34 · 382 阅读 · 0 评论 -
作用域链
作用域链的作用var a = 1function b(){ var a = 2 function c(){ var a = 3 console.log(a) } c()}b() // 3 作用域链的作用是保证执行环境有权访问的变量和函数是有序的 作用域链只能向上访问,变量访问到 windows 对象终止,作用域链向下访问变量是不允许的 作用域就是变量和函数的可访问的范围,即作用域控制着的变量和函数的可见性和生命周期...原创 2020-10-29 14:36:50 · 152 阅读 · 0 评论 -
EventLoop总结
1.浏览器中的eventloop和node中的有什么区别?----在 Node 中的 Event Loop 和浏览器中的是完全不相同的东西浏览器端的Event loop 1.一个函数执行栈,一个事件队列,一个微任务队列 函数调用栈: 用来执行js代码 task队列(宏任务队列): 存放异步任务 微任务队列: 存放另一些异步任务 运行过程: 在event loop调度一个宏任务之前,先查看微任务队列是否有未执行的任务 如果有,先原创 2020-10-29 14:35:23 · 88 阅读 · 0 评论 -
JS数组方法面试总结
1.操作数组的方法不改变原数组: slice 截取数组 concat 联合数组 join 将转换成字符串 forEach map filter reduce 不改变原数组改变原数组: push unshift 返回数组的长度 pop shift 返回删除的元素,参数无用 reverse 返回反置的数组 sort 排序数组 splice 截取数组的同时,还会插入数据,返回的值为截取出来的元素// 1. array.push(item1, item2, …, itemX) //原创 2020-10-29 14:32:12 · 309 阅读 · 0 评论 -
字符串方法面试总结
字符串方法// 1. charAt 可返回指定位置的字符var str = "HELLO WORLD";var n = str.charAt(2); // L// 2. concat 用于连接两个或多个字符串,并返回新的字符串。var str1 = "Hello ";var str2 = "world!";var n = str1.concat(str2); //输出结果为Hello world!// 3. indexOf 返回某子字符串在该字符串中第一次出现的位置,如果没有找到原创 2020-10-29 14:30:06 · 85 阅读 · 0 评论 -
箭头函数面试总结
1.箭头函数和普通函数的区别? 箭头函数不能用于构造函数 箭头函数没有 prototype 属性 箭头函数不绑定 arguments 箭头函数不绑定this 箭头函数无法使用 call()或 apply()来改变其运行的作用域2.箭头函数笔试题// 箭头函数的this是继承父级作用域的this,而不是指向调用者// 箭头函数没有自己的this也并不能使用call,apply以及bind去绑定thisfunction fun () { return () => {原创 2020-10-29 14:28:26 · 276 阅读 · 1 评论 -
websocket和ajax轮询的区别
1.ajax轮询ajax,每一个前端开发都用过,都知道它一般是异步的,也能同步使用。聊天是需要长连接的,在一些场景下我们不想使用比较耗费资源的长连接,又想实现数据监听,这时候我们就会使用ajax的轮询ajax轮询一般分为两种:第一种是设定一个定时器,无论有无结果返回,时间一到就会继续发起请求,这种轮询耗费资源,也不一定能得到想要的数据,这样的轮询是不推荐的。二种轮询就是在第一次请求的时候,如果返回数据了那么就在成功的回调里面再次发起这个请求,就像递归一样,调用本方法。如果时间太久,失败了,同样的原创 2020-10-29 14:23:26 · 1007 阅读 · 0 评论 -
ES6-解构赋值原理
1.解构是什么es6允许按照一定的模式,从数组或对象中提取值,给变量进行赋值,称为解构赋值。原理:其实内在是针对可迭代对象的 Iterator 接口,通过遍历器按顺序获取对应的值进行赋值Iterator作用: 1. 为各种数据解构提供统一的访问接口 2. 使得数据解构能按次序排列处理 3. 可以使用ES6最新命令 for of进行遍历2.那些能进行解构赋值原生具备 Iterator 接口的数据结构如下:1. Array Map Set String Typed原创 2020-10-27 19:22:00 · 938 阅读 · 0 评论 -
Promise封装ajax
1.先思考如何拿取异步对象中的属性?http状态码?readyState属性都代表什么:0:未初始化。尚未调用open()方法1:启动。已经调用open()方法,但是未调用send()方法2:发送。已经调用send()方法,但尚未接收到响应3:接收。已经接收到部分响应数据4:完成。已经接收到全部响应数据如何拿数据收到响应后,响应的数据会自动填充到 XMLHttp 对象的属性,因此 readState、status 和 responseText 属性都要通过 XMLHttp 去拿,而不是原创 2020-10-26 18:47:49 · 106 阅读 · 0 评论 -
手写Promise原理实现
1.Promise是什么?1. ES6 异步编程的一种解决方案,比传统的方案(回调函数和事件)更加的合理和强大2. 好处 异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数3. promise可以解决异步的问题,本身不能说promise是异步的2.Promise有几种状态?1. 它存在三种不同的状态,并在某一时刻只能有一种状态2. 而且状态只可能从 pending => fulfilled pending => rejected3. 这两种变化,并且一旦状态改变,任何操原创 2020-10-26 15:47:20 · 136 阅读 · 0 评论