升级 Node 4 的 7 个理由

前些日子 Node 4 终于发布了。作为 node.js 和 io.js 合并之后发布的第一个稳定版,Node 4 给我们带来了诸多 ES6 特性。你可以阅读这篇文章概览一下 ES6 的特性,本文将为你展示我们在 Node 4 中如何使用 ES6。

1. 模板字符串

以前我们拼字符串的话会像下边这样写:

var message = [
    'The quick brown fox',
    'jumps over',
    'the lazy dog'
].join('\n');

这段代码的作用是把字符串拼接成几句话。然而更极客的做法是像 multiline 一样利用注释来格式化字符串:

var multiline = require('multiline');
var message = multiline(function () {/*
    The quick brown fox
    jumps over
    the lazy dog
*/});

好消息是,ES6 已经自带模板字符串语法了:

var message = `
    The quick brown fox
        jumps over
        the lazy dog
`;

模板字符串语法还能插入字符串变量:

var name = 'Schroedinger';

// 别再这么写糟蹋自己了!
var message = 'Hello ' +>http://www.0771ybyy.com/news/1806.html< name + ', how is your cat?';
var message = ['Hello ', name, ', how is your cat?'].join('');
var message = require('util').format('Hello %s, how is your cat?', name);

// 快使用模板字符串吧!
var message = >http://www.0771ybyy.com/news/1807.html<`Hello ${name}, how is your cat?`;

点击这里去 MDN 查阅关于模板字符串的详细说明。

2. 类

ES5 中我们定义一个类会这么写:

var Pet = function (name) {
    this._name = name;
};

Pet.prototype.sayHello>http://www.0771ybyy.com/news/1804.html< = function () {
    console.log('*scratch*');
};

Object.defineProperty(Pet.prototype, 'name', {
  get: function () {
    return this._name;
  }
});


var Cat = function (name) {
    Pet.call(this, name);
};

require('util').inherits(Cat, Pet);

Cat.prototype.sayHello >http://www.0771ybyy.com/news/1805.html<= function () {
    Pet.prototype.sayHello.call(this);
    console.log('miaaaauw');
};

怎么说呢,用原型链的写法可以实现效果,但是比起专门的类定义来说这么写总觉得有点怪,而且费时间。ES6 中为我们提供了类定义的语法糖:

class Pet {
    constructor(name) {
        this._name = name;
    }
    sayHello() {
        console.log('*scratch*');
    }
    get name() {
        return this._name;
    }
}

class Cat extends >http://www.0771ybyy.com/news/1802.html<Pet {
    constructor(name) {
        super(name);
    }
    sayHello(>http://www.0771ybyy.com/news/1803.html<) {
        super.sayHello();
        console.log('miaaaauw');
    }
}

这样看起来就挺舒服了。点击这里了解更多。

3. 箭头函数

函数内的 this 指向问题已经让无数程序员晕头转向了,我们经常可以看到为了获取到外部的this指向我们不得不这么写:

Cat.prototype.notifyListeners = function () {
    var self = this;
    this._listeners.forEach(function>http://www.0771ybyy.com/news/1800.html< (listener) {
        self.notifyListener(listener);
    });
};
Cat.prototype.notifyListeners = function () {
    this._listeners.forEach(function (listener) {
        this.notifyListener>http://www.0771ybyy.com/news/1801.html<(listener);
    }.bind(this));
};

ES6 中我们可以直接使用箭头函数语法让匿名函数的 this 指向所在的作用域:

Cat.prototype.notifyListeners = function () {
    this._listeners.forEach((listener) => {
        this.notifyListener(listener);
    });
};

4. 对象定义

当你要使用对象的时候,你可以用非常简便的方法定义它:

var age = 10, name>http://www.0771ybyy.com/news/1799.html< = 'Petsy', size = 32;

// 以前我们只能这么写
var cat = {
    age: age,
    name: name,
    size: size
};

// ES6 中可以这么写了
var cat>http://www.0771ybyy.com/news/1798.html< = {
    age,
    name,
    size
};

另外,根据这个特性我们可以非常方便的给对象添加函数了

5. Promise

以前我们只能依赖 bluebird 或者 Q 等库做 Promise 处理,现在我们可以使用原生的 Promise 函数了。原生 Promise 拥有以下几个 API:

var p1 = new Promise>http://www.0771ybyy.com/news/1797.html<(function (resolve, reject) {});
var p2 = Promise.resolve(20);
var p3 = Promise.reject(new Error());
var p4 = Promise.all(p1, p2);
var p5 = Promise.>http://www.0771ybyy.com/news/1796.html<race(p1, p2);

// and obviously
p1.then(() => {}).catch(() => {});

6. 字符串类型新增方法

ES6 为字符串增加了很多新函数:

// 在许多场景下使用下面的函数会比用 `indexOf()` 要方便很多
name.startsWith('a')
name.endsWith('c');
name.includes('b');

// 重复 name 三次
name.repeat(3);

而且 ES6 还增强了对 unicode 字符的支持

7. let 和 const 语法

猜猜下面这段代码将会返回什么:

var x = 20;
(function () {
    if (x === 20) {
        var x = 30;
    }
    return x;
}()); // -> undefined

是的,由于 var x 声明提前导致返回的结果是 undefined。现在你可以使用let 代替 var 语法,你将会得到一个不一样的结果:

let x = 20;
(function (>http://www.0771ybyy.com/case/zhichuangjibing/1776.html<) {
    if (x === 20) {
        let x = 30;
    }
    return x;
}()); // -> 20

结果将返回 20。这个原因是因为 var 是函数作用域而let是块级作用域,if块体内定义的 let x 只在自己的块体中有效。你可以点击这里了解更多。

另外要说的是 Node 现在支持使用 const 关键字定义常量了,这样能保证你的变量值补丁:

var MY_CONST = 42; // >http://www.0771ybyy.com/case/zhichuangjibing/1775.html<不要这样做啦...
const MY_CONST = 42; // 最好的做法是这样

MY_CONST = 10;  // 如果上面是用 const 定义的这句将不生效

总结

Node 4 携带了大量的 ES6 特性,我希望本文的几个例子能让你看到一些不错的地方从而升级到这个版本。当然还有很多其他的语言特征(像 maps/setssymbols 和 generators),如果感兴趣可以去翻一下 官方的这篇文档。以上!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值