第3章 用ES6来书写Node
3.1 新时代的EMCAScript
ES2015
的一个目标就是让JavaScript在语言层面
有支撑大型应用的能力。
JavaScript的缺陷
ES5的语法缺陷
:几乎无法支持模块化;没有很好的面向对象支持;没有局部作用域;各种令人惊喜的语法细节,例如0.1+0.2或者[]==[]等
Node对新标准的支持
Node在6.0版本
及之后实现了对ES6的全面支持。
可以使用nvm
管理Node版本
。
3.2 块级作用域
ES5
中的作用域只有两种:全局作用域和函数作用域;
变量提升
:指JavaScript解释器会将变量的声明提到当前作用域最前的现象,仅仅提升变量的声明,不会提升变量的值。
let关键字
let关键字
会创建一个块级作用域
,使用let关键字
声明的变量只能在当前块级作用域中使用。
注意⚠️:
- 重复声明:在同一个块级作用域中,不能使用let关键字重复声明一个变量。
- 变量提升:let关键字可以解决ES5中变量提升带来的问题。其实let在内部也存在变量提升,但是会存在一个
临时死区
,在这个临时死区内无法对变量进行取值或者赋值。
const关键字
被声明为const
的变量不可以再被修改,也不能被重复声明。
const可以用于模块的引入
。
const声明的变量虽然不能被修改,但使用const修饰的对象却可以修改。
3.3 数组
ES2015新增的原型方法:
copyWithin()、find()、findIndex()、fill()、entries()、keys()、values()
find()和findIndex()
用于查找数据中第一个符合条件的数组成员,接受一个回调函数
作为参数,对于数据的每个成员都会按顺序执行这个回调函数,可以自己定义筛选条件。
find()函数
返回相应元素的值,findIndex
方法会返回对应元素的位置,它们都只匹配第一个满足条件的元素。
相比indexOf方法
,新增的这两个方法可以用来处理NaN
;
from()方法
from方法
用于将一个类数组对象转换为数组。
ES5中可以使用Array.prototype.slice
方法来将一个类数组对象转换成数组,但是需要调用call
方法,否则返回一个空数组。
// ES5
var a1 = Array.prototype.slice.call(a);
// ES6
var a2 = Array.from(a);
//from 不是定义在prototype上的
fill()方法
fill方法
用于给定的值来填充数组,通常用来初始化一个新建的array对象。
var a = new Array(5);
a.fill(0);
数组的遍历
ES6提供了三个新方法——entries
,keys
和values
用于遍历数组,它们之间的区别在于keys是对键名
的遍历,values是对键值
的遍历,entries是对键值对
的遍历。
var a = ['a', 'b', 'c']
for(let i of a.keys()) {
console.log(i)