ES6
let const
声明变量,块级作用域,let在for外会失效。const声明的变量保存的地址不能被修改,但地址指向的值可以修改;
https://www.yuque.com/zhangwujian/js/rsktz0
解构赋值
数组中相同位置赋值[xx, xx] = [1, 2]; 对象中相同属性名赋值 {} ={};
模版字符串 ``
反引号``,其中可以使用${}中加入变量完成字符串拼接
对象简写
当对象的key和value的变量名相同时,可以在{}中直接写入变量,变量名即属性名;let name = ‘a’; let sex = ‘boy’; const student = {name, sex};
箭头函数 =>
this指向声明函数的作用域
不能作为构造函数;不能使用arguments
普通形式() => {}; 形参只有一个时,()可以省略;res => {};函数体只有一句的时候可以省略{},并省略return;res => res + res;
函数参数默认值
函数形参可以默认赋值 function fn (a, b = 2) {…};
rest参数 …
函数形参使用…可以把参数全部传进去。类似arguments,但arguments是类数组, …args的话,args是数组
扩展运算符 …
…在调用函数中使用,可以把一个数组的值一个一个的传进去;fn(…arr);
扩展运算符可以连接数组、复制数组(浅拷贝)、类数组转化成真数组(arguments、doms)
symbol
新的数据类型,唯一的,一个symbol与另一个symbol不相等、不能运算;
symbol内置11个值 整个symbol对象作为对象的属性(唯一的)
迭代器 [Symbol.iterator]
是一个接口,数据结构部署了迭代器接口就可以遍历,es6新语法 for of为迭代器服务
工作原理,创建一个指针对象,指向当前数据结构的起始位置。内置一个next方法,指针自动向下一个成员,返回包含value和done属性的对象,指针一直移动直至最后一个(value undefined。done true)
可以自定义遍历。(例如声明一个对象包含一个数组,可以实现for of 这个对象但遍历返回的是其中数组的成员)
生成器
一个特殊的函数,使用*声明,内部使用yield将代码分割,外部使用.next方法一段一段的执行,yield后面是返回结果;next内可以传参数,传参将作为上一个yield的返回结果;
可以逐行执行方法,或者在声明的方法中调用next 解决回调地狱;
Promise
是一个构造函数,接受参数是一个函数,函数参数resolve reject 默认),构造的实例可以使用.then .catch 处理回调;解决异步问题,IO、网络请求等;.then可以链式调用;
Set(集合
自动去重。有iterator接口,可以使用扩展运算符和for of;API:size、add、delete、has、clear
Map(键值对的集合
键值对的集合,key value组成,可以使用任何数据类型作为key,有iterator接口,可以使用…和for of(for of返回i是key和value长度为2的数组);APi:size、set、get、delete、has、clear
class 类
构造函数的另一种形式,大部分可以用es5的构造函数实现,只是写法更接近面向对象语言
使用:声明用class ClassName {};使用 let test = new ClassName ();class的属性赋值在{}中的constructor中(接参赋值),方法使用fn () {}的写法直接写在class的{}里;class的静态属性使用static标记,生成的实例访问为undefined,但class上可以访问到;
继承:es5的继承可以在子构造函数中调用父构造函数并使用.call(this, 参数) 改变this指向并传参,设置子构造函数的prototype为 new 父构造函数;es6可以使用extents完成继承,并在子内使用super()调用父类的constructot并传参,子类中可以写父类的同名方法对父类方法进行重写;
class中可以使用get和set设置访问属性和设置属性的方法(可以使用_拼接一个私有属性避免get 和 set造成死循环产生栈溢出,但实际上_name是可以被访问到的,get name 时return的是_name,set时是 _name = newVal;construcor中 this._name = name;)
模块化 export/import
优点:防止命名冲突、代码复用、高维护性
import导入、引入;通用引入 as别名设置 解构赋值引入;export导出、暴露; export default默认暴露;
兼容性和导入npm包的问题,所以使用bable对es6模块化的代码进行编译(配合打包)最后引入
数值扩展
Number.EPSILON表示js的最小精度,Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON; // true
0b:二进制 0o:八进制 0x:十六进制
Number.isFinte()检测一个数是不是有限数
Number.isNaN()判断是不是一个NaN
Number.parseInt/Number.parseFloat 将字符串转成整数/浮点数
Number.isInteger()判断一个数是不是整数
Math.trunc()抹去小数
Math.sign()返回1/0/-1;返回参数是正数1还是负数-1或0
对象扩展
Object.is()判断两个值是否相等 类似 ===,但Object.is(NaN, NaN); // true
Object.assign(); 合并对象;第二个参数覆盖第一个参数;
Object.setPrototypeOf 设置原型对象 (getPrototypeOf获取)不建议这样,建议在create时就把原型加上
ES7
Array.includes 数组是否包含某个元素,返回true/false
幂运算/指数运算 ** 和Math.pow()一样) Math.pow(2, 10) === 2 * 10
ES8
async 和 await:async返回一个promise对象,除了返回promise的reject和抛出错误 ,返回的都是成功的promise;await必须放在async函数中,await接收的值是promise resolve的值(使用try await resolve catch reject)
Object.values与Object.keys相似,返回对象所有value的数组;
Object.entries返回key value的二维数组[[key,value],[key,value]];
Object.getOwnPrototypeDescriptors 返回对象所有自身属性的描述对象(是否可遍历,读写等,使用Object.create时描述属性的属性)
ES9
对象的rest和扩展运算符…,对象也可以像数组一样使用…;形参中的…(rest参数)和实参的…(扩展)
正则扩展
可以在正则表达式中使用?
反向断言:?<=;
使用 . 可以匹配除换行符外的任意单个自符,可以用来正则匹配html解决需要/s匹配换行符的问题,爬虫匹配html好用(.*?)
ES10
Object.fromEntries,接收一个二维数组或map返回一个键值对象,Object.entries的逆运算;
trimStart和trimEnd 去除字符串左边(开头)/右边(结尾)的空白字符;
flat和flatMap,数组扁平化,flat参数为深度,数组map后返回的结果再扁平化,flatMap = map + flat处理;
Symbol.prototype.description,获取Symbol值的描述
ES11**
私有属性,class中使用#描述私有属性,实例化之后不能在实例上访问到私有属性,需要使用class中的方法表达;
Promise.allSettled,接收一个promise数组,返回一个promis对象,结果一定是成功,value中是每一个promise的结果;类似的Promise.all,all要求每一个都成功才返回resolve,有一个失败则返回reject
String.ptototype.matchAll,字符串匹配正则可以匹配全部,返回结果是一个可迭代对象,可以使用for of 或扩展运算符展开
可选链操作符 ?. :对象层级比较深时可以用?.代替对象链式undefined的判断。例 config && config.db && config.db.host 可以代替为 config?.db?.host;避免出现对象下没有某个属性导致报错的问题;
空值合并 如果没有这个属性 可以使用 ?? 合并空值,把后面的值赋给属性 和 || 作用类似, 但 ??只识别null 和 undefined
动态import;可以在事件中使用import,当事件出发才去导入模块
BigInt类型,大整数类型,参数必须是整数返回结果是后面加n,js的精度是2的53次方,超过之后运算失准,可以使用BigInt类型计算,运算需要两个值都是BigInt类型,不管是不是大整数;
globalThis,全局对象,无论在哪使用始终指向的都是全局对象