锋利的ES6 — 常用新特性
锋利的ES6 系列文章介绍ES6(ES5+)中新增的比较好用的新特性。本篇聊聊ES6中非常常用而且好用的新特性。
箭头函数
箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this
,arguments
,super
或new.target
。箭头函数表达式更适用于那些本来需要匿名函数的地方,并且它不能用作构造函数。
箭头函数的语法是
1 | (param1, param2, …, paramN) => { statements } |
箭头函数不会创建自己的this
,它只会从自己的作用域链的上一层继承this
。因此,在下面的代码中,传递给setInterval
的函数内的this
与封闭函数中的this
值相同
下面我们来看一个例子:
1 | // 使用箭头函数前 |
在项目当中,箭头函数使用非常广泛,因为箭头函数非常简洁,而且没有自己的this,他的this指向外层
- 如果希望this指向内层,就用普通函数
- 如果希望this指向外层,就用箭头函数
- 如果两层this都需要,那就用普通函数并且在外层
var _this = this
解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)
以前,要把数组中的值提取出来,得这么写
1 | var arr = [2, 5, 7] |
ES6可以这么写
1 | var arr = [2, 5, 7] |
上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。
如果解构不成功,变量的值就等于undefined
1 | var arr = [2, 5] |
这样的话c就是undefined
但是,也可以给默认值
1 | var arr = [2, 5] |
当c可以被解构的时候就等于解构出来的值,没有的话c的值就默认为1
对象也是可以解构赋值的。
但是对象的解构赋值跟数组是有区别的,数组是按顺序解构,对象是按属性名解构,也就是说定义的变量名对应对象的属性名。
1 | var person = { |
同样的,如果结构失败会得到undefined
,同时也可以给默认值
1 | var person = { |
而且解构赋值还可以嵌套使用
1 | var person = { |
let
let
命令,用来声明变量。它的用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效。
什么叫代码块?简单地说:使用{}括起来的代码被称为代码块。比如:if、for、try…catch这些都是代码块
1 | var a = 20 |
我们可以看到,在if块里用let定义的b变量在这个块级外面是不可使用的。
let还有一个特点就是没有变量提升
1 | console.log(a) // undefined |
暂时性死区
只要块级作用域内存在let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
1 | var a = 20 |
面代码中,存在全局变量a,但是块级作用域内let
又声明了一个局部变量a,导致后者绑定这个块级作用域,所以在let
声明变量前,打印a会报错。这种情况被称为暂时性死区
const
const
声明一个只读的常量。一旦声明,常量的值就不能改变
1 | const a = 10 |
const
一旦声明变量,就必须立即初始化,不能留到以后赋值
1 | const a // SyntaxError: Missing initializer in const declaration |
const
命令声明的常量也是不提升
1 | console.log(a) // ReferenceError: Cannot access 'a' before initialization |
const
命令同样存在暂时性死区
1 | const a = 20 |
但是,我们来看看下面的代码
1 | const arr = [ 2, 5, 6] |
我们可以看到,用const
申明的数组和对象是可以被修改的,但是不能被重新赋值,这说明了什么问题?
const
实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const
只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了
扩展运算符
扩展运算符(spread)是三个点(...
)。它好比 rest 参数的逆运算,将一个数组转为一系列用逗号分隔的值。
1 | function sum(x, y, z) { |
也可以拷贝数组
1 | var arr = [3, 4, 5] |
甚至在拷贝的同时追加元素
1 | var arr = [3, 4, 5] |
在ES2018的标准里,扩展也可以用于对象
1 | var obj = { |
模板字符串
模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量
1 | // 普通字符串 |
函数默认参数
ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法。
1 | function log(x, y) { |
ES6允许在定义参数的时候给默认值
1 | function log(x, y = 'World') { |
代码不是万能的,但不写代码是万万不能的
Dary记
-
更多干货,尽在公众号
转载请注明来源,文末有原始链接。欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 dary1112@foxmail.com
创作不易,您的打赏是我更新的动力
-
支付宝
-
微信
文章标题:锋利的ES6 — 常用新特性
文章字数:1.9k
本文作者:Dary
发布时间:2020-03-18, 16:21:00
最后更新:2020-03-19, 16:25:04
原始链接:http://www.xiongdalin.com/2020/03/18/ES6-often/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。
Built By Dary