本篇文章记录,关于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.使用函数参数的默认值。