:warning:表示ES5和ES6的区别
:seven:表示ES7中的内容
第一章 块级绑定
:warning:ES5:存在变量出现undefiend的变量提升、不存在块级声明
- let和const的重大区别:
- 试图对之前用const声明的常量进行赋值会抛出错误。但是const声明的对象可以修改,因为const阻止的是对于变量绑定的修改,不是对其中成员值的修改
- let 可以在循环内工作,也可以在for-in和for-of内工作
- const不可以在循环内工作(这是修改const声明的变量),但可以在for-in和for-of中中作(这是对变量的修改)
第二章,字符串与正则表达式
unicode方法
- UTF-16中引入代理对解决超出范围代码点表示方法问题,允许使用两个16位码元来表示单个代码点,即用4个字节储存。
:warning:ES5对于那些需要4
个字节储存的字符(Unicode 码点大于0xFFFF
的字符)会认为它们是两个字符。
ES5与unicode相关的方法:
- charAt() 方法可返回指定位置的字符
- charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。
- String.fromCharCode方法,用于从码点返回对应字符
at()方法:对应原本的charAt() 方法
codePointAt()方法:对应原来的charCodeAt()方法。可以用于检测一个字符由两个字节还是4个字节组成
1
2
3function is32Bit(c) {
return c.codePointAt(0) > 0xFFFF;
}String.fromCodePoint()方法:对应原来的String.fromCharCode方法
子字符串方法
:warning:只有indexOf
方法,可以用来确定一个字符串在另一个字符串中具体位置。
- ES6新增如下方法
- includes():返回布尔值,表示是否找到了参数字符串。
- startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
- endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
- Repeat():方法返回一个新字符串,表示将原字符串重复
n
次。
:seven:ES2017 引入了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart()
用于头部补全,padEnd()
用于尾部补全。
模板字面量
:warning:改变ES5字符串换行的方式,ES6可以直接包含换行和缩进
正则表达式
:warning:ES5中正则表达式只匹配码元。ES6中引入u标志,即正则表达式会匹配字符而不是码元。
y
修饰符的作用与g
修饰符类似,也是全局匹配,后一次匹配都从上一次匹配成功的下一个位置开始。g
修饰符只要剩余位置中存在匹配就可,而y
修饰符确保匹配必须从剩余的第一个位置开始。y
修饰符的一个应用,是从字符串提取 token
:warning:在ES5中var regex = new RegExp(/xyz/, 'i');
不行,在ES6中可行。
第三章 函数
:warning:ES5中给函数参数指定默认值,需要typeof "undefined"
,ES6规定了指定默认参数的方式
:warning:ES5非严格模式下,arguments总是会被更新以反映出具名参数的变化,但在严格模式下,不再会反映出具名参数的变化。ES6则和ES5的严格模式一样。
:warning: ES5中的不具名参数操作起来很麻烦,ES6引入rest参数。
:warning:ES5判断函数是不是使用了new来调用,最流行的方式是使用instanceof。但是在var notAPerson=Person.call(person,"Mike")
的情况下,无法分辨。ES6引入new.target元属性。
:warning:ES5中在代码块内部函数声明会出现错误,但是ES6中不会
:warning:ES5中尾部调用是一个新的栈帧被创建并推到调用栈智商,用于表示该次函数调用。ES6中用优化会清除当前帧栈并再次利用它,而不是为尾调用创建新的栈帧。
第四章 扩展的对象功能
:warning:ES5对象字面量不能有重复属性,但是ES6可以有重复属性,值以最后一个为准
:warning: ES5避免创建新的全局函数,避免在object对象的原型上添加新方法,而是尝试寻找哪些对象应该被添加新方法。ES6提出Object.assign()
:warning:ES5对象的原型在初始化完成后会保持不变,但是ES6通过添加Object.setPrototypeOf()方法改变指定对象的原型。
- ES6引入super,是当前对象的原型的一个指针,实际上就是object.getPrototypeOf(this)的值
- 当有多重继承的时候,object.getPrototypeOf(this)会只想上一级原型,而super会指向最上层的原型
第五章 解构:更方便的数据访问
- 在使用var、let、const进行数组解构时,必须提供初始化器
:warning:ES5中交换变量需要用到第三个变量,但是在ES6中只需要[a,b]=[b,a]
- 在ES5中clone数组一般用concat(),在ES6可以使用剩余项语法
let[...clonedColors]=colors
第六章 符号与符号属性
- Symbol():创建符号值
- Smybol.for():创建共享符号值
- Symbol.keyFor():在全局符号注册表中根据符号值搜索出对应的键值
- Symbol.hasInstance():判断指定对象是否为本函数的一个实例
- Symbol.isConcatSpreadable():指示对象被添加到数组时应该适用分离的属性值
:warning:ES5想要识别目标对象到底是什么类型的时候,此时对象已经在环境之间经历了传递,就无法正确识别出类型,需要通过以下方式正确识别。
1 | function isArray(value){ |
在ES6中,Symbol.toStringTag():代表了所有对象的一种属性,定义object.prototype.toString.call()被调用时应该返回什么值。
- Symbol.unscopables():在Array.prototype上使用,指定哪些属性不孕育在with语句内被绑定。因为ES6添加了values方法,导致with语句内部的values并不会指向局部变量values,而是回想数组的values方法。
第七章 Set和Map
⚠️ES5中使用对象属性模拟Set和Map,会有以下问题:
- 键有可能会被转换为相同的字符串
- 在需要布尔值的地方,0也会被转换为false