ES6入门 (上)

108 阅读5分钟

本篇文章记录,关于ES6的学习使用。

ES6特指ES2015,泛指ES2015之后更新的新特性,包括ES2015、ES2016、ES2017等。

为了达到学习目的,我们从结果论出发,哪些常用的新特性可以增强我们的编码风格,使我们的编码更强,更易于理解。所以本篇目的就是为了将ES6新语法运用到编码实践中。

本文参考 阮一峰著的ES6标准入门,某次番外过生日,朋友送了一本es6,奈何看的不多,学习不多,而今又捡起来,系统归纳学习一下。电子书链接会附到文末,有能力的大家可以买一本实体书放到床头。

不多说,直接进入正文。

1.块级作用域。

es6中新提出了两个新的声明变量命令 let和const let可以完全取代var 并且没有副作用。两者的语义相同,且使用let在声明的代码块内有效,所以就形成了块级作用域,块级作用域使得立即执行的匿名函数下岗了。

全局环境内,使用const声明常量。const符合函数式编程的思想。

ps:避免在块级作用域内声明函数,如有必要使用函数表达式。(javaScript权威指南第六版)

2.解构赋值

主要包括:数组,对象,函数参数的解构赋值。

数组:模式匹配,等号两边模式相同,就能从数组中提取值。还可以嵌套。

let [a,b,c]=[1,2,3];

解构不成功就是undefined。

let [foo]=[];

允许指定默认值

let [foo=true]=[];

foo为true

对象的解构赋值同理。

const {firstName,lastName}=obj;

函数参数:

函数的参数成员如果是对象,优先使用解构赋值。

function getFullName({firstName,lastName}){

}

对象、数组、函数的扩展

对象:

1.简洁表示:

const foo = 'bar';const baz = {foo};baz // {foo: "bar"}// 等同于const baz = {foo: foo};

function f(x, y) { return {x, y};}// 等同于function f(x, y) { return {x: x, y: y};}f(1, 2) // Object {x: 1, y: 2}

const o = { method() {   return "Hello!";}};// 等同于const o = { method: function() {   return "Hello!";}};

2.单行定义与多行定义:

const a = {k1:v1,k2:v2}const b = {   k1:v1,   k2:v2,}

单行定义最后一个成员不用逗号,多行定义最后一个成员使用逗号。

3.对象尽量静态化

对象定义后不要随意添加新属性,如有必要,使用Object.assign方法。

4.对象属性名是动态化的 ,在创建的时候就可以使用属性表达式定义

let lastWord = 'last word';const a = { 'first word': 'hello',[lastWord]: 'world'};a[lastWord] // "world"
数组

1.使用扩展运算符(...)。

console.log(...[1, 2, 3])// 1 2 3console.log(1, ...[2, 3, 4], 5)// 1 2 3 4 5

function push(array, ...items) { array.push(...items);}function add(x, y) { return x + y;}const numbers = [4, 38];add(...numbers) // 42

扩展运算符的使用:

1.1复制数组

原:

const a1 = [1, 2];const a2 = a1.concat();a2[0] = 2;a1 // [1, 2]

const a1 = [1, 2];// 写法一const a2 = [...a1];// 写法二const [...a2] = a1;

1.2 合并数组

const arr1 = ['a', 'b'];const arr2 = ['c'];const arr3 = ['d', 'e'];// ES5 的合并数组arr1.concat(arr2, arr3);// [ 'a', 'b', 'c', 'd', 'e' ]// ES6 的合并数组[...arr1, ...arr2, ...arr3]// [ 'a', 'b', 'c', 'd', 'e' ]//这两个方法都是浅拷贝

1.3 与解构赋值一起使用

// ES5a = list[0], rest = list.slice(1)// ES6[a, ...rest] = list

const [first, ...rest] = [1, 2, 3, 4, 5];first // 1rest  // [2, 3, 4, 5]const [first, ...rest] = [];first // undefinedrest  // []const [first, ...rest] = ["foo"];first  // "foo"rest   // []

ps:扩展运算符用于数组赋值,只能用到最后一位

2.使用Array.from将类似数组的对象转换为数组。

Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。

实际运用中 将arguments对象转换为数组

let arrayLike = {   '0': 'a',   '1': 'b',   '2': 'c',   length: 3};// ES5的写法var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']// ES6的写法let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

ps:只要是部署了 Iterator 接口的数据结构,Array.from都能将其转为数组

扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。Array.from方法还支持类似数组的对象。所谓类似数组的对象,本质特征只有一点,即必须有length属性。因此,任何有length属性的对象,都可以通过Array.from方法转为数组,而此时扩展运算符就无法转换。

3.新的方法 includes()

Array.prototype.includes方法返回一个布尔值,表示某个数组是否包含给定的值,与字符串的includes方法类似。ES2016 引入了该方法

indexOf方法有两个缺点,一是不够语义化,它的含义是找到参数值的第一个出现位置,所以要去比较是否不等于-1,表达起来不够直观。二是,它内部使用严格相等运算符(===)进行判断,这会导致对NaN的误判

4.at()

数组实例增加了at()方法,接受一个整数作为参数,返回对应位置的成员,支持负索引。这个方法不仅可用于数组,也可用于字符串和类型数组(TypedArray)。

const arr = [5, 12, 8, 130, 44];arr.at(2) // 8arr.at(-2) // 130

ps:如果参数位置超出了数组范围,at()返回undefined

函数

1.立即执行函数使用箭头函数的形式。

2.使用rest(...)运算符代替arguments变量。

3.使用函数参数的默认值。