10个最佳ES6特性

in vue.js前端React.js with 0 comment

原文:Top 10 ES6 Features Every Busy JavaScript Developer Must Know
译文:10个最佳ES6特性 - Fundebug

译者按: 人生苦短,我用ES6。
为了保证可读性,本文采用意译而非直译,并且对源代码进行了大量修改。另外,本文版权归原作者所有,翻译仅用于学习。

ES6,正式名称是ECMAScript2015,但是ES6这个名称更加简洁。ES6已经不再是JavaScript最新的标准,但是它已经广泛用于编程实践中。如果你还没用过ES6,现在还不算太晚…

下面是10个ES6最佳特性,排名不分先后:

函数参数默认值

function foo(height, color)
{
    var height = height || 50;
    var color = color || 'red';
    //...
}

这样写一般没问题,但是,当参数的布尔值为false时,是会出事情的!比如,我们这样调用foo函数:

foo(0, " "," ")

因为0的布尔值为false,这样height的取值将是50。同理color的取值为‘red’。

function foo(height = 50, color = 'red')
{
    // ...
}

模板字符串

var name = 'Your name is ' + first + ' ' + last + '.'
var name = `Your name is ${first} ${last}.`

ES6的写法更加简洁、直观。

多行字符串

var roadPoem = 'Then took the other, as just as fair,\n\t'
    + 'And having perhaps the better claim\n\t'
    + 'Because it was grassy and wanted wear,\n\t'
    + 'Though as for that the passing there\n\t'
    + 'Had worn them really about the same,\n\t'
var roadPoem = `Then took the other, as just as fair,
    And having perhaps the better claim
    Because it was grassy and wanted wear,
    Though as for that the passing there
    Had worn them really about the same,`

解构赋值

var data = $('body').data(); // data有house和mouse属性
var house = data.house;
var mouse = data.mouse;
var { house, mouse} = $('body').data()

对于数组也是一样的:

var [col1, col2]  = $('.column');

对象属性简写

var bar = 'bar';
var foo = function ()
{
    // ...
}

var baz = {
  bar: bar,
  foo: foo
};
var bar = 'bar';
var foo = function ()
{
    // ...
}

var baz = { bar, foo };

箭头函数

function foo() 
{
    console.log(this.id);
}

var id = 1;

foo(); // 输出1

foo.call({ id: 2 }); // 输出2
var foo = () => {
  console.log(this.id);
}

var id = 1;

foo(); // 输出1

foo.call({ id: 2 }); // 输出1

Promise

setTimeout(function()
{
    console.log('Hello'); // 1秒后输出"Hello"
    setTimeout(function()
    {
        console.log('Fundebug'); // 2秒后输出"Fundebug"
    }, 1000);
}, 1000);
var wait1000 = new Promise(function(resolve, reject)
{
    setTimeout(resolve, 1000);
});

wait1000
    .then(function()
    {
        console.log("Hello"); // 1秒后输出"Hello"
        return wait1000;
    })
    .then(function()
    {
        console.log("Fundebug"); // 2秒后输出"Fundebug"
    });

Let与Const

使用Var
var定义的变量未函数级作用域:

{
  var a = 10;
}

console.log(a); // 输出10

使用let与const
let定义的变量为块级作用域,因此会报错:(如果你希望实时监控JavaScript应用的错误,欢迎免费使用Fundebug)

{
  let a = 10;
}

console.log(a); // 报错“ReferenceError: a is not defined”

const与let一样,也是块级作用域。

function Point(x, y)
{
    this.x = x;
    this.y = y;
    this.add = function()
    {
        return this.x + this.y;
    };
}

var p = new Point(1, 2);

console.log(p.add()); // 输出3
class Point
{
    constructor(x, y)
    {
        this.x = x;
        this.y = y;
    }

    add()
    {
        return this.x + this.y;
    }
}

var p = new Point(1, 2);

console.log(p.add()); // 输出3

模块化

JavaScript一直没有官方的模块化解决方案,开发者在实践中主要采用CommonJS和AMD规范。而ES6制定了模块(Module)功能。

module.js中使用module.exports导出port变量和getAccounts函数:
module.exports = {
  port: 3000,
  getAccounts: function() {
    ...
  }
}

main.js中使用require导入module.js:

var service = require('module.js')
console.log(service.port) // 输出3000
module.js中使用export导出port变量和getAccounts函数:
export var port = 3000
export function getAccounts(url) {
  ...
}

main.js中使用import导入module.js,可以指定需要导入的变量:

import {port, getAccounts} from 'module'
console.log(port) // 输出3000

也可以将全部变量导入:

import * as service from 'module'
console.log(service.port) // 3000

参考链接

Comments are closed.