《深入浅出ES6》读书笔记1

: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
    3
    function 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
2
3
function isArray(value){
return Object.prototype.toString.call(value)==="[object Array]";
}

在ES6中,Symbol.toStringTag():代表了所有对象的一种属性,定义object.prototype.toString.call()被调用时应该返回什么值。

  • Symbol.unscopables():在Array.prototype上使用,指定哪些属性不孕育在with语句内被绑定。因为ES6添加了values方法,导致with语句内部的values并不会指向局部变量values,而是回想数组的values方法。

第七章 Set和Map

⚠️ES5中使用对象属性模拟Set和Map,会有以下问题:

  1. 键有可能会被转换为相同的字符串
  2. 在需要布尔值的地方,0也会被转换为false