需要了解的几个最佳 ES6 特性
ES6,正式名称是 ECMAScript2015,但是ES6这个名称更加简洁。ES6已经不再是 JavaScript 最新的标准,但是它已经广泛用于编程实践中。如果你还没用过ES6,现在还不算太晚…
下面是几个ES6最佳特性,排名不分先后:
- 函数参数默认值
- 模板字符串
- 多行字符串
- 解构赋值
- 展开运算符
- 对象属性简写
- 箭头函数
- Promise
- Let 与 Const
- 类
- 模块化
1. 函数参数默认值
- 不使用 ES6
为函数的参数设置默认值:
1 | function foo(height, color) |
这样写一般没问题,但是,当参数的布尔值为false时,是会出事情的!比如,我们这样调用 foo 函数:
1 | foo(0, "", "") |
因为 0 的布尔值为false,这样height的取值将是50。同理 color 的取值为‘red’。
- 使用 ES6
1 | function foo(height = 50, color = 'red') |
2. 模板字符串
- 不使用 ES6
使用+号将变量拼接为字符串:
1 | var name = 'Your name is ' + first + ' ' + last + '.' |
- 使用 ES6
将变量放在大括号之中:
1 | var name = `Your name is ${first} ${last}.` |
ES6的写法更加简洁、直观。
3. 多行字符串
- 不使用 ES6
使用“\n\t”
将多行字符串拼接起来:
1 | var roadPoem = 'Then took the other, as just as fair,\n\t' |
- 使用 ES6
将多行字符串放在反引号``之间就好了:
1 | var roadPoem = `Then took the other, as just as fair, |
4. 解构赋值
数组和对象是 JS 中最常用也是最重要表示形式。为了简化提取信息,ES6 新增了解构,这是将一个数据结构分解为更小的部分的过程
- 不使用 ES6
当需要获取某个对象的属性值时,需要单独获取:
1 | const people = { |
- 使用 ES6
一次性获取对象的子属性:
1 | //对象 |
5.Spread Operator 展开运算符
ES6 中另外一个好玩的特性就是Spread Operator 也是三个点儿…接下来就展示一下它的用途。
组装对象或者数组
1 | //数组 |
有时候我们想获取数组或者对象除了前几项或者除了某几项的其他项
1 | //数组 |
对于 Object 而言,还可以用于组合成新的 Object 。(ES2017 stage-2 proposal) 当然如果有重复的属性名,右边覆盖左边
1 | const first = { |
6. 对象属性简写
- 不使用 ES6
对象中必须包含属性和值,显得非常多余:
1 | var bar = 'bar'; |
- 使用 ES6
对象中直接写变量,非常简单:
1 | var bar = 'bar'; |
7. 箭头函数
- 不使用 ES6
普通函数体内的 this,指向调用时所在的对象。
1 | function foo() |
- 使用 ES6
箭头函数体内的 this,就是定义时所在的对象,而不是调用时所在的对象。
1 | var foo = () => { |
8. Promise
- 不使用 ES6
嵌套两个 setTimeout 回调函数:
1 | setTimeout(function() |
- 使用 ES6
使用两个 then 是异步编程串行化,避免了回调地狱:
1 | var wait1000 = new Promise(function(resolve, reject) |
9. Let 与 Const
- 使用 var
var 定义的变量未函数级作用域:
1 | { |
- 使用 let 与 const
let 定义的变量为块级作用域,因此会报错:(如果你希望实时监控 JavaScript 应用的错误,欢迎免费使用Fundebug)
1 | { |
const 与 let 一样,也是块级作用域。
10. 类
- 不使用 ES6
使用构造函数创建对象:
1 | function Point(x, y) |
- 使用 ES6
使用Class定义类,更加规范,且你能够继承:
1 | class Point { |
11. 模块化
JavaScript 一直没有官方的模块化解决方案,开发者在实践中主要采用CommonJS和AMD规范。而ES6制定了模块(Module)功能。
- 不使用 ES6
Node.js 采用CommenJS规范实现了模块化,而前端也可以采用,只是在部署时需要使用Browserify等工具打包。这里不妨介绍一下CommenJS规范。
module.js中使用module.exports导出port变量和getAccounts函数:
1 | module.exports = { |
main.js中使用require导入module.js:
1 | var service = require('module.js') |
- 使用 ES6
ES6中使用export与import关键词实现模块化。
module.js中使用export导出port变量和getAccounts函数:
1 | export var port = 3000 |
main.js中使用import导入module.js,可以指定需要导入的变量:
1 | import {port, getAccounts} from 'module' |
也可以将全部变量导入:
1 | import * as service from 'module' |