class类
class类JS里的类就是构造函数的语法糖
基本用法
类里面有个constructor函数,可以接收传递过来的参数,同时返回实例对象
constructor函数只要new生成实例时,就会自动调用这个函数,如果我们不写这个函数,类也会自动生成这个函数
公共属性放在constructor中,公共方法直接在类里面写函数声明,会自动添加至原型对象中
class类没有变量提升,所以必须先定义类,才能通过类实例化对象
super()调用父类里的constructor方法,可以向里面传参,就等于Father.call(this,x,y),super 必须在子类的this前面调用
class里面的方法的this指向的是调用者,如果调用者不是类的实例,就需要改变this的指向
1234567891011121314151617181920212223class Person { constructor(age) { // 属性 this.myName = '刘逍' this.age = age } // 静态方法 static ...
Set、Map、WeakSet、WeakMap
Set、Map、WeakSet、WeakMap
Set_、_Map_、_WeakSet_、_WeakMap 是 ES2015 中新增的几个对象:
set 类似于数组,但是成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构。Set 和 WeakSet 与数组类似,准确的它他们是集合,这两者的区别就是 Set 可以存储任何数据类型,而 WeakSet 只能存储对象的引用,而且是弱引用;Set 对象在实际开发中最常见的就是实现数据去重,示例代码如下:
12345const arr = [1, 2, 2, 3, 4, 3, 5]const set = new Set(arr)// set对象可以使用 ... 展开 所有项console.log([...set]) // [ 1, 2, 3, 4, 5 ]
map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值 ...
展开运算符
展开运算符数组扩展运算符
数组的扩展运算符可以将一个数组转为用逗号分隔的参数序列,且每次只能展开一层数组。
12345const arr = [1, 2, 3, 4, 5, 6]const newArr = [...arr] // 复制数组const arr1 = ['two', 'three'];const arr2 = ['one', ...arr1] // 合并数组console.log(Math.max.call(null, ...arr)) // 将数组中的每一项作为参数使用
扩展运算符被用在函数形参上时,它还可以把一个分离的参数序列整合成一个数组:
12345678function mutiple(...args) { let result = 1; for (var val of args) { result *= val; } return result;}mutiple(1, 2, 3, 4) // 24
改变 promise 状态和指定回调函数谁先谁后?
改变 promise 状态和指定回调函数谁先谁后?
都有可能, 正常情况下是先指定回调再改变状态, 但也可以先改状态再指定回调
如何先改状态再指定回调?在执行器中直接调用 resolve()/reject()延迟更长时间才调用 then()
什么时候才能得到数据?如果先指定的回调, 那当状态发生改变时, 回调函数就会调用, 得到数据如果先改变的状态, 那当指定回调时, 回调函数就会调用, 得到数据
promise实例有哪些状态,怎么改变状态
promise实例有哪些状态,怎么改变状态Promise的实例有三个状态:Pending(进行中)Resolved(已完成)Rejected(已拒绝)
当把一件事情交给promise时,它的状态就是Pending,任务完成了状态就变成了Resolved、没有完成失败了就变成了Rejected。
如何改变 promise 的状态resolve(value): 如果当前是 pending 就会变为 resolvedreject(error): 如果当前是 pending 就会变为 rejected抛出异常: 如果当前是 pending 就会变为 rejected
注意:一旦从进行状态变成为其他状态就永远不能更改状态了。
重温解构赋值
重温解构赋值对象解构
形式:const { x, y } = { x: 1, y: 2 }
默认:const { x, y = 2 } = { x: 1 }
改名:const { x, y: z } = { x: 1, y: 2 }
数组解构
规则:数据结构具有 Iterator 接口可采用数组形式的解构赋值
形式:const [x, y] = [1, 2]
默认:const [x, y = 2] = [1]
函数参数解构
数组解构:function Func([x = 0, y = 1]) {}
对象解构:function Func({ x = 0, y = 1 } = {}) {}
应用场景:
交换变量值:[x, y] = [y, x]
返回函数多个值:const [x, y, z] = Func()
定义函数参数:Func([1, 2])
提取 JSON 数据:const { name, version } = packageJson
定义函数参数默认值:function Func({ x = 1, y = 2 } = {}) {}
遍历 Map 结构:for (l ...
let、const、var的区别
let、const、var 的区别
块级作用域: 块作用域由 { }包括,let 和 const 具有块级作用域,var 不存在块级作用域。块级作用域解决了 ES5 中的两个问题:
内层变量可能覆盖外层变量用来计数的循环变量泄露为全局变量
变量提升: var 存在变量提升,let 和 const 不存在变量提升,即在变量只能在声明之后使用,否在会报错。
给全局添加属性: 浏览器的全局对象是 window,Node 的全局对象是 global。var 声明的变量为全局变量,并且会将该变量添加为全局对象的属性,但是 let 和 const 不会。
重复声明: var 声明变量时,可以重复声明变量,后声明的同名变量会覆盖之前声明的遍历。const 和 let 不允许重复声明变量。
暂时性死区: 在使用 let、const 命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区。使用 var 声明的变量不存在暂时性死区。
初始值设置: 在变量声明时,var 和 let 可以不用设置初始值。而 const 声明变量必须设置初始值。
指针指向: let 和 const 都是 ...
async语法怎么捕获异常
async 语法怎么捕获异常
async 函数内部的异常可以通过 *.catch()*或者 try/catch 来捕获,区别是try/catch 能捕获所有异常,try 语句抛出错误后会执行 catch 语句,try 语句内后面的内容不会执行catch()只能捕获异步方法中 reject 错误,并且 catch 语句之后的语句会继续执行
123456789101112131415161718192021async函数错误捕获,以登录功能为例 async function getCatch () { await new Promise(function (resolve, reject) { reject(new Error('登录失败')) }).catch(error => { console.log(error) // .catch()能捕获到错误信息 }) console.log('登录成功 ...
async/await对比Promise的优势
async/await对比Promise的优势
代码读起来更加同步,Promise虽然摆脱了回调地狱,但是then的链式调⽤也会带来额外的阅读负担
Promise传递中间值⾮常麻烦,⽽async/await⼏乎是同步的写法,⾮常优雅
错误处理友好,async/await可以⽤成熟的try/catch,Promise的错误捕获⾮常冗余
调试友好,Promise的调试很差,由于没有代码块,你不能在⼀个返回表达式的箭头函数中设置断点,如果你在⼀个.then代码块中使⽤调试器的步进(step-over)功能,调试器并不会进⼊后续的.then代码块,因为调试器只能跟踪同步代码的每⼀步。
await的使用注意点
await的使用注意点
await命令后面的Promise对象,运行结果可能是rejected,所以最好把await命令放在try…catch代码块中。
多个await命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。
await命令只能用在async函数之中,如果用在普通函数,就会报错。
async 函数可以保留运行堆栈。