ES6/7开发项目

从ES6正式成为标准发布以后,几家欢乐几家愁。有的人认为javascript丢失了自己的特点,但是我相信大部分人是乐见其成的。ES6新增了大量的新特性,使得javascript更加工程化,更加适应企业级大工程化研发,这是大势所趋。

需要注意的是,当前Node.js 8 并没有对 es6的 module 进行支持,因此我们要避免使用 import/export

let 和 const

在ES6之前,相信javascript程序员都遇到过全局变量提升的坑。letconst 限制为块级作用域。简单来说就是 {代码块} 花括号包起来的部分。在 if / elsetry / catch / finally 及函数中经常出现。跟 var 还有一个区别是,letconst 不能重复声明,也不存在变量提升。

  1. let bb = '111';
  2. try {
  3. let aa = 'test';
  4. } catch (e) {
  5. console.log(aa); // undefined
  6. console.log(bb); // 111
  7. }
  1. let bb = 1;
  2. let bb = '111'; //Error

总结: 在编程中使用const声明常量;使用let声明变量。如非必要,尽量不使用var

箭头函数

javascript的this作用域也是难点之一,有很多奇怪的用法。特别是在回调风格的代码内,this作用域往往容易使人犯错。由此诞生了一堆的关于this作用域相关的操作,例如 call / bind 等等。箭头函数的作用是绑定上文this作用域,向函数内传递,保持函数内this作用域和外部一致。

  1. //以前我们要这样写:
  2. let self = this;
  3. array.forEach(function(item){
  4. self.xxx
  5. })
  6. //箭头函数
  7. array.forEach(item => {
  8. this.xxx
  9. })

Class 和 extends

  1. 从本质上说,ES6classes主要是给创建老式构造函数提供了一种更加方便的语法,并不是什么新魔法
  2. —— Axel RauschmayerExploring ES6作者

从功能上来讲,class声明就是一个语法糖,它只是比我们之前一直使用的基于原型的行为委托功能更强大一点。

  1. class blackCat extends cat {
  2. constructor() {
  3. super.test();
  4. }
  5. }

静态方法

静态方法是构造方法自己的方法,不能被类的实例化对象调用。我们使用static关键字定义静态方法。

  1. class Food {
  2. constructor() {
  3. this.name = name;
  4. this.protein = protein;
  5. this.carbs = carbs;
  6. this.fat = fat;
  7. }
  8. static count () {
  9. console.log(111);
  10. }
  11. }
  12. //等同于ES5的写法
  13. //Food.count = function(){
  14. // console.log(111);
  15. //};
  16. const dummy = new Food();
  17. dummy.count(); //Error
  18. Food.count(); // 111

模板字符串

模板字符串 解决了三个痛点,允许你做如下操作:

  • 定义在字符串内部的表达式,称为 字符串插值。
  • 写多行字符串无须用换行符 (n) 拼接。
  • 使用“raw”字符串 – 在反斜杠内的字符串不会被转义,视为常量。
  1. let aa = 'test';
  2. let str = `1111111${aa}2222222`;
  3. console.log(str); // 1111111test2222222

async/await

async/await 在ES6并没有成为标准发布,但是作为解决回调问题的下一代方案,一直被大家所关注。目前Node.js 4Node.js 6 均未能支持,需要依赖于babel的编译。在最新发布的 Node.js 8 中,已经获得官方支持,可预见不久后将大行其道。

  1. async function getFile() {
  2. let content = await fs.readFile('./test.txt', 'utf-8').catch(e => '');
  3. }