本系列文章是本人学习相关知识时所积累的笔记,以记录自己的学习历程,也为了方便回顾知识;故文章内容较为随意简练,抱着学习目的来的同学务必转移他处,以免我误人子弟~
参考资料:
阮一峰:ECMAScript 6 入门
let和const
- let和const都只在块级作用域内有效
- 不支持变量提升->暂时性死区(temporal dead zone)
- 不允许重复声明
- let和const实现了块级作用域
- 函数可在块级作用域中声明
- 函数声明和函数表达式的区别
- const本质是要求变量指向的内存地址不可变
- Object.prototype.freeze()冻结对象(的属性)
- 顶层对象:浏览器的window对象、node的global对象
- es6 全局对象和顶层对象脱钩:let、const、class声明的全局变量不再是顶层对象的属性
解构赋值
- 具有Iterator的数据结构可以采用数组形式的解构赋值
- 可以指定默认值,只有数组成员(可枚举对象成员)严格等于(===)undefined,默认值才有效;
- 数组需要按顺序,而对象不用(但变量名必须属性名相同)
- 变量名与属性名不一致时,使用
pattern : variable
前者匹配对象的属性名,后者为新变量名 - 字符串也能解构赋值,此时字符串是类数组对象;
- 数值和布尔值进行解构赋值时,会将数值和布尔值转化为对象,所以是对象的结构赋值;
- 函数参数可解构赋值
- 两种函数参数默认值的写法
用途:
…遍历Map结构等
字符串
-
使用
\uxxxx
表示字符,xxxx
表示字符的Unicode码点 -
es6使用 {} 接收16进制数可成功编译
-
\uD842\uDFB7
->'?'
;\u20BB7
->' 7'
;es6使用{}解决这个问题:\u{20BB7}
->'?'
(其中D842+DFB7=20BB7); -
以 utf-16 格式储存字符,每个字符两个字节;偶尔有4个字节的单个字符,js当成两个字符
-
codePointAt方法会正确返回 32 位的 UTF-16 字符的码点(即码点超过 FFFF 的字符)
-
es6为字符串增加 Iterator 接口,可以识别大于0xFFFF的码点;
-
模板字符串:支持嵌入变量和多行字符串
-
模板的 {} 之间能进行运算和调用函数
-
raw() 方法,处理模板字符串的变量和对反斜杠转义
-
标签模板是函数调用的特殊形式;
-
标签模板的一个用途是i18n(国际化处理)
-
String.raw()
的价值何在?? -
String.fromCharCode()
不能识别码点大于0xFFFF
的字符->es6提供String.fromCodePoint()
,可以识别大于0xFFFF
的字符 -
normalize(): Unicode 正规化;
-
includes(), startsWith(), endsWith(), repeat(), padStart(), padEnd()
正则表达式
- RegExp构造函数 修饰符被允许且可覆盖源正则表达式
- u 修饰符,处理4个字节的utf-16字符编码
- 点(
.
)字符不能识别码点大于0xFFFF的字符,需要使用u修饰符(点(.
)字符可识别换行外的所有字符) - RegExp.prototype.unicode 属性,表示是否有 u 修饰符
- y 修饰符,与 g 修饰符相同,都是全局,但 y 必须连续(粘连 sticky)
- y修饰符的设计本意,就是让头部匹配的标志^在全局匹配中都有效
- RegExp.prototype.sticky 属性,判断是否有 y 修饰符
- RegExp.prototype.flags 属性,返回修饰符
- 4种行终止符
- dotAll模式:s 修饰符,使点(
.
)字符能匹配任意字符 - RegExp.prototype.dotAll 属性,表示是否有 s 修饰符
- 后行断言和后行否定断言 :
/(?<=\%)\d+/
和/(?<!\%)\d+/
分别表示只匹配百分号之后的数字和只匹配不在百分号后的数字 - Unicode 属性类
- 组匹配(es5)和具名组匹配(es6),模式为:问号+尖括号+组名(
?<name>
),可在exec()
方法返回的匹配结果的groups
属性上引用组名
数值
- 二进制表示法:0b或0B;八进制表示法:0o或0O
- Number.isFinite:不是数值一律返回 false;
- Number.isNaN 方法:不是 NaN 一律返回 false;
- Number.parseInt() 和 Number.parseFloat() 方法,与全局的parseInt和parseFloat一样
- 常量 Number.EPSILON是JavaScript能够表示的最小精度
Number.MAX_SAFE_INTEGER
,Number.MIN_SAFE_INTEGER
,Number.isSafeInteger()
- ES6 在 Math 对象上新增了 17 个与数学相关的方法
- 指数运算符:** ,右结合
函数
- 函数参数默认值
- 函数的length属性 表示没有指定默认值的参数个数
- 作用域(context)
- rest参数,可以向函数传递任意数目的参数
- name属性,返回函数名
- 箭头函数:直接调用无返回值的函数:
let fn = () => void doesNotReturn();
无需{}
代码块 - 实际原因箭头函数根本没有自己的this,导致内部的this就是外层代码块的this
- 箭头函数函数体内的this对象,是定义时所在的对象,而不是使用时所在的对象
- 箭头函数可以在定义时绑定this,从而this变成静态
- 尾调用和尾调用优化、尾递归优化
数组
- 扩展运算符:可以将字符串转为数组;识别4个字节的Unicode字符
- 只有定义了Iterator接口的对象才可以使用扩展运算符
- Array.from() 将类似数组的对象(array-like object)和可遍历(iterable)的对象转为真正的数组
- 类似数组的对象,本质特征只有一点,即必须有length属性
- Array.from() 也可以将字符串转为数组,且能正确处理4字节Unicode字符
- Array.of() 将一组值转化为数组
- copywithin 方法 与splice类似
- 数组实例的 entries(),keys() 和 values() :keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。
- include方法的好处是语义直白且能正确处理NaN
- flat()支持多维展开;flatMap()可遍历数组元素,只支持一维展开
- ES6 则是明确将空位转为undefined。
对象
- 属性简洁的表示法:变量名作为属性名,属性值为变量指向的值(或指针)
- 尽量使用 Object.keys() 遍历属性
for...in
,Object.key(obj)
,Object.getOwnPropertyNames(obj)
,Object.getOwnPropertySymbols(obj)
,Reflect.ownKeys(obj)
- super 关键字,指向当前对象的原型对象,只能用在对象的方法中
- Object.is()与
===
的行为基本一致,主要解决===
的+0和-0,NaN的问题 - Object.assign()的目标对象不能为undefined或null
- Object.assign()总是拷贝一个属性的值,而不会拷贝它的取值和赋值方法
Symbol
- Symbol是原始数据类型,可作为对象的属性名
- Symbol值可转字符串和布尔值,不能转数值
- Symbol属性名不可被
for...in
、for...of
、Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
,只有Object.getOwnPropertySymbols()
可以获得Symbol属性名 Reflect.ownKeys
可以返回常规键名和Symbol键名Symbol.for(attr)
生成在全局注册的Symbol值,attr相同时,Symbol值也相同
Set、WeakSet
- 新的数据结构,类似数组,成员唯一;add()方法添加成员
- 去除数组重复成员:[…new Set(array)] 或 Array.from(new Set(array))
- 属性:size 返回成员总数;操作方法:add 添加成员、delete 删除成员、has 判断成员是否存在、clear 清楚所有成员
- 遍历方法:
keys()
values()
entries()
forEach()
for...of
- 交集、并集、差集
- 无法直接改变Set的结构
- WeakSet与Set类似,只接受对象成员,且对象成员都是弱引用(弱引用:即垃圾回收机制不考虑WeakSet的成员对象的引用,垃圾回收机制会自动回收对象占用的内存,不过该对象在不在WeakSet中)
- 即WeakSet里面的对象引用随时失效,故规定WeakSet不可遍历
- WeakSet有add、delete、has方法
- WeakSet 的一个用处,是储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏
Map WeakMap
- Map的键不限于字符串
- size属性
- 操作方法:set、get、has、delete、clear
- 遍历方法:keys、values、entries、forEach
- WeakMap键名只限于对象(null除外),弱引用
- WeakMap只有get、set、has、delete
- WeakMap 应用的典型场合就是 DOM 节点作为键
- WeakMap 的另一个用处是部署私有属性
Proxy
- proxy可以改变目标对象的某些行为,支持13种行为的拦截
Reflect
Promise
- 三种状态:pending(进行中)、fulfilled(已成功)、rejected(已失败)
- 只有异步操作才能改变状态;状态改变后不再改变
- 实例化Promise对象,接受一个函数作为参数,该函数的两个参数是resolve和reject
- resolve函数的作用是将Promise状态从pending变为fulfilled,并将异步操作的结果作为参数传递出去:resolve(value)
- reject函数的作用是将Promise状态从pending变为rejected,并将异步操作报出的错误作为参数传递出去:reject(error)
- then方法指定resolved状态(fulfilled)状态的回调函数和rejected状态的回调函数:
promise.then(function(value) { // success }, function(error) { // failure });
;两个函数都是接收Promise对象传出的值作为参数; - (当前脚本中,异步操作要在所有同步操作完成后才执行)
- Promise.prototype.then()返回新的Promise实例
- 关于resolve接收一个Promise对象的异步操作流程;只有在该promise对象的状态变为resolved时才调用指定的resolve的回调函数
Iterator
- 遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制
- 任何数据只需要部署Iterator接口就可以实现遍历操作
- 默认的 Iterator 接口部署在数据结构的Symbol.iterator属性
- 凡是部署了Symbol.iterator属性的数据结构,就称为部署了遍历器接口
Generator
- yield具有记忆功能,可以记住遍历对象的当前状态
- generator函数与一般函数不同,不可以当成一般函数使用(在需要一般函数为参数的方法中不能使用generator函数,有句法错误)
- Generator 函数执行后,返回一个遍历器对象。该对象本身也具有Symbol.iterator属性,执行后返回自身。
- throw()抛出的错误现在函数内部被捕获(如果有try-catch语句),如果继续调用throw()方法会在外面抛出错误
- throw()只能从内部或者外部捕获一次,
- return()方法提前结束遍历,参数值为返回对象的value值
- 如果在 Generator 函数内部,调用另一个 Generator 函数,默认情况下是没有效果的。
- 使用yield* ,在generator函数内插入generator函数,实质上相当于在遍历列表中插入其他遍历列表
- 子例程:栈堆的先进后出执行方式,只有子函数结束,父函数才能结束;
- 协程:多线程运行,可以随时切换线程的执行权,
Class 继承
- extends 实现继承
- 继承类(子类)必须在 constructor 方法中调用 super 方法
- 子类继承父类的静态方法
- super 作为父类的构造函数,返回子类的实例
- super 作为对象
- 在普通方法中,是父类的原型对象;通过super调用父类的方法时,方法内部的this指向当前的子类实例。
- 在静态方法中,super 指向父类
ArrayBuffer
- WebGL,就是指浏览器与显卡之间的通信接口,为了满足 JavaScript 与显卡之间大量的、实时的数据交换,它们之间的数据通信必须是二进制的
- ArrayBuffer对象:代表内存之中的一段二进制数据;
- TypedArray视图:共包括 9 种类型的视图
- DataView视图:可以自定义复合格式的视图
- ArrayBuffer对象代表储存二进制数据的一段内存,它不能直接读写,只能通过视图(TypedArray视图和DataView视图)来读写,视图的作用是以指定格式解读二进制数据