本文为 ES6 系列的第一篇。旨在给新同学一些指引,带大家走近 ES6 新特性。
简要介绍:

  • 什么是 ES6

  • 它有哪些“明星”特性

  • 它可以运行在哪些环境

What's ES6

ES6 or ECMAScript 2015 ?

ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。

ECMA-262 标准 第6版。计划以后每年发布一次标准,使用年份作为标准的版本。因为当前版本是在2015年发布的,所以又称ECMAScript 2015。ECMA 的全称是 European Computer Manufacturers Association(欧洲计算机制造商协会)。ECMA-262 被 ISO 国际标准化组织采纳为 ISO/IEC 16262:2011

日常讨论的 JavaScript 通常还包括 DOM(文档对象模型)、BOM(浏览器对象模型),而 ES6 不包含这些。

ES6 现状

  • 主流框架全面转向 ES6

    • Angular 2

    • ReactJs

    • koa

  • 兼容性 对比表格

Well-known Features

本节介绍一些广为人知的 ES6 “明星”特性,也就是讨论 ES6 时经常提及的一些新特性。当然 ES6 并不仅限于这些,还包括很多其他有用的特性,会在本系列的其他文章中介绍。

let and const

let 命令

原来的 javascript 中没有块级作用域,只有函数级作用域。ES6 中新增了 let 命令,使用 let 命令代替 var 命令声明变量,具有块级作用域。

  • 函数级作用域

function test() {var hello = 'world';console.log(hello);
}
test(); // 'world'
console.log(hello); // Error: hello is not defined
  • 块级作用域

var 命令

if(true) {var hello = 'world';console.log(hello); // 'world'
}
console.log(hello); // 'world'

let 命令

if(true) {let hello = 'world';console.log(hello); // 'world'
}
console.log(hello); // Error: hello is not defined

const 命令

使用 const 命令声明常量

const STATUS_NOT_FOUND = 404;

常量的值为只读,不能修改

STATUS_NOT_FOUND = 200;
// SyntaxError: "STATUS_NOT_FOUND" is read-only

Template String

  • 传统的字符串

var name = 'es6';var sayhello = 'hello, \
my name is ' + name + '.';console.log(sayhello); 

输出:

hello, my name is es6.
  • ES6 模板字符串

var name = 'es6';var sayhello = `hello,
my name is ${name}.`;console.log(sayhello);

输出:

hello,
my name is es6.

空格和换行都会被保留

Arrow Function

允许使用 => 定义函数,箭头函数自动绑定当前上下文 this。

x => x+1

等同于匿名函数

function (x) {return x + 1;
}
  • 多个参数:

(a,b) => a+b

等同于

function (a, b) {return a + b;
}
  • 多行函数体:

(a,b) => {console.log(a + b);return a + b;
}

等同于

function (a, b) {console.log(a + b);return a + b;
}

Promise

原生的 Promise 实现,不再需要 bluebirdQ+

Generator

Generator 生成器允许你通过写一个可以保存自己状态的的简单函数来定义一个迭代算法。和 Generator 一起出现的通常还有 yield。

Generator 是一种可以停止并在之后重新进入的函数。生成器的环境(绑定的变量)会在每次执行后被保存,下次进入时可继续使用。generator 字面上是“生成器”的意思,在 ES6 里是迭代器生成器,用于生成一个迭代器对象。

function *gen() {yield 'hello';yield 'world';return true;
}

以上代码定义了一个简单的 generator,看起来就像一个普通的函数,区别是function关键字后面有个*号,函数体内可以使用yield语句进行流程控制。

var iter = gen();
var a = iter.next();
console.log(a); // {value:'hello', done:false}
var b = iter.next();
console.log(b); // {value:'world', done:false}
var c = iter.next();
console.log(c); // {value:true, done:true}

当执行gen()的时候,并不执行 generator 函数体,而是返回一个迭代器 Iterator。迭代器具有 next() 方法,每次调用 next() 方法,函数就执行到yield语句的地方。next() 方法返回一个对象,其中value属性表示 yield 关键词后面表达式的值,done 属性表示是否遍历结束。generator 生成器通过 next 和 yield 的配合实现流程控制,上面的代码执行了三次 next() ,generator 函数体才执行完毕。

Class

在 JavaScript 中引入 OO 面向对象。实际上是语法糖,只是看上去更面向对象而已。也有观点极力反对 Class,认为 Class 隐藏了 JavaScript 本身原型链的语言特性,使其更难理解。

一半以上库是按 OO/class 方式写的,除了jQuery之外,几乎每个“严肃”的JS基础库都有一个Class实现,工具、IDE 更容易识别,JavaScript 引擎性能优化。---- johnhax

  • ES5

function Point(x,y){this.x = x;this.y = y;
}Point.prototype.toString = function () {return '(' + this.x + ', ' + this.y + ')';
}
  • ES6

class Point {constructor(x, y) {this.x = x;this.y = y;}toString() {return '('+this.x+', '+this.y+')';}}

Module

许多JS框架都会实现一套自己的 module/loader 机制。反复造轮子这也就罢了,更大的问题在于,这些轮子互相都是不兼容的。结果就造成了JS社区的分化和内耗,阻碍了JS库和组件在较细粒度上的竞争和发展,JS框架和库的切换成了强迫开发者做出非此即彼的选择。缺乏语言级别的 module,其恶果就是既没有足够的标准库,也很难像其他语言一样通过丛林法则发展出事实标准库。 ---- johnhax

社区主流解决方案有 CommonJS 和 AMD,分别用于服务器端和浏览器端,浏览器端还有 seajs 遵循的 CMD。

CommonJS

exports.firstName = 'mei';
exports.lastName = 'qingguang';
exports.year = 1988;// ormodule.exports = {firstName: 'mei',lastName: 'qingguang',year: 1988
}// ormodule.exports = function() {// do something
}

AMD

define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好a.doSomething()// 此处略去 100 行b.doSomething()// ...exports.action = function() {};
}) 

CMD

define(function(require, exports, module) {var a = require('./a')a.doSomething()// 此处略去 100 行var b = require('./b') // 依赖可以就近书写b.doSomething()// ... exports.action = function() {};
})

ES6 Module

  • export 命令 和 import 命令

export var firstName = 'mei';
export var lastName = 'qingguang';
export var year = 1988;
import {firstName, lastName, year} from './profile'console.log(firstName, lastName, year)
  • 模块整体输出

var firstName = 'mei';
var lastName = 'qingguang';
var year = 1988;export {firstName, lastName, year};
import * as Profile from './profile'console.log(Profile.firstName, Profile.lastName, Profile.year)
  • export default 整体输出

export default function() {console.log('My name is mei qingguang');
};
import sayMyName from './profile' console.log(sayMyName())

Node.js 运行环境

可以在 Node.js 和 io.js 中使用部分 ES6 特性。Node.js 和 io.js 都是使用 V8 引擎作为 JavaScript 运行环境,io.js 集成了更高版本的 V8 引擎,因此可以比 Node.js 支持更多的 ES6 特性。

在 Node.js 中,需要使用 --harmony 参数开启 ES6 特性,包括所有已完成、待完成和修订中的特性。为了避免用到那些废弃的特性,可以通过加类似 --harmony_generators 参数开启特定的特性。

而在 io.js 中,所有已完成的稳定 ES6 特性都已经默认开启,不需要加任何运行时参数。而待完成和修订中的特性也可以通过特定的参数开启。

io.js 默认开启了以下 ES6 特性:

  • block scoping

    • let

    • const

    • function-in-blocks

  • Classes

  • Collections

    • Map

    • WeakMap

    • Set

    • WeakSet

  • Generators

  • Binary and Octal literals

  • Object literal extensions

  • Promises

  • New String methods

  • Symbols

  • Template strings

编译器

有两个著名的编译器,能将 ES6 代码编译成 ES5 代码,本节只介绍 Babel。

  • Babel

  • Traceur

Babel

Babel 从根本上讲是一个平台,这是它与 compile-to-JS 语言 CoffeeScript 和 TypeScript 最大的不同。Babel 的插件系统允许开发者自定义代码转换器并插入到编译过程。Babel 还能提升 JavaScript 的执行速度,在编译时进行性能优化。

babel 命令

编译单个文件

babel script.js --out-file script-compiled.js

监听文件变化

babel script.js --watch --out-file script-compiled.js

编译整个文件夹

babel src --out-dir lib

使用 source map,方便调试

babel script.js --out-file script-compiled.js --source-maps

babel-node 命令

使用 babel-node 命令代替 node 命令,实时编译并执行 ES6 代码。不要在生产环境使用 babel-node 命令,它非常耗内存,并且会拖慢应用的性能。

node app.js
babel-node app.js

require hook

使用 require 钩子,可以让你的应用 require 模块时自动编译 ES6 代码。例如:

run.js

require('babel/register')
require('./app.js')

run.js 作为整个应用的入口,就可以在 app.js 和其他业务代码中编写 ES6 代码,当代码被 require 进来时,自动编译成 ES5 代码。

Learn a bit of ES6 daily

ES6 Katas

ES6 走马观花(ECMAScript2015 新特性)相关推荐

  1. 前端面试题二:ES6/7/8新特性、性能优化、数据交互、H5新特性

    目录 一.ES6/7/8新特性 二.性能优化 三.数据交互 四.H5新特性 一.ES6/7/8新特性 1.ES6中新增了哪些数据类型? Symbol类型(基本) Set类型(复杂) Map类型(复杂) ...

  2. ES6/ES7/ES8新特性汇总

    ES6起各个版本的新特性汇总 ES全称ECMAScript,ECMAScript是ECMA制定的标准化脚本语言.目前JavaScript使用的ECMAScript版本为ECMA-417.关于ECMA的 ...

  3. ES6简介、新特性、Babel编译器、babel-cli工具、babel-polyfill工具(安装和使用)

    目录 简介 ECMAScript 的历史 ES6新特性 1.语法方面 2.功能方面 ​ Babel编译器 babel-cli工具 第一步:创建一个文件夹,名称为app,在vscode中打开终端,终端路 ...

  4. 最全的—— ES6有哪些新特性?

    目录 ES6新特性 1.let和const 2.symbol 3.模板字符串 3.1 字符串新方法(补充) 4.解构表达式 4.1 数组解构 4.2 对象解构 5.对象方面 5.1 Map和Set 5 ...

  5. ES6 开发常用新特性以及简述ES7

    一.关于变量 ES6新增:块级作用域变量 1.let定义块级作用域变量 没有变量的提升,必须先声明后使用 let声明的变量,不能与前面的let,var,conset声明的变量重名 { { consol ...

  6. ES6中的新特性:Iterables和iterators

    文章目录 简介 什么是iteration Iterable对象 普通对象不是可遍历的 自定义iterables 关闭iterators 总结 简介 为了方便集合数据的遍历,在ES6中引入了一个iter ...

  7. web前端技巧-ES6新特性与重点知识汇总(二)

    ES6框架的新特性我们今天再来介绍其他的一些,还是带好写本本做好笔记,我们马上开始. 七.扩展运算符 扩展运算符(spread)是三个点(-).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔 ...

  8. ECMAscript6(ES6)新特性语法总结(一)

    ES6/ES2015,,在ES5的基础上扩展了很多新的功能,在使用的时候要慎重,因为有一部分js代码在部分浏览器是不兼容的,但是所有写在服务器端的代码基本上都支持ES6的写法. 新特性: 一.开启严格 ...

  9. ES7-ES11新特性汇总

    前言 ES全称ECMAScript,ECMAScript 和 JavaScript 的关系是,前者是后者的规范,后者是前者的一种实现,从15年es6发版后,到目前的es11,es的新特性被广泛使用,成 ...

  10. 一幅长文细学JavaScript(五)——ES6-ES11新特性

    5 ES版本 摘要 ES5的先天不足致使ES后续版本的发展,这也是前端人员绕不开的一个点.如果我们想要在工作和面试中轻松解决问题,那么了解ES6-ES11是必不可少的. 在本文中,我将采用一种更加通俗 ...

最新文章

  1. linux内核竞争条件漏洞,Linux内核竞争条件漏洞-导致远程代码执行
  2. WINDOWS SERVER 2003从入门到精通之组策略应用
  3. 直播平台搭建中你需要注意的小细节
  4. [六省联考2017]分手是祝愿(期望+DP)
  5. Vue2.x-03使用vue-cli搭建Vue开发环境
  6. Struts2的自动装配
  7. 【笔记】css卡片式地展示人物信息和一些展示信息的相关美化记录
  8. 浅谈权限管理的设计与实现
  9. c# 联合halcon 基于相关性 模板匹配_宣城seo公司_有效利用及时相关性解决关键词排名上不到首页的难题...
  10. word List18
  11. php shell ddos,用shell解决ddos攻击实例
  12. iOS开发之开源项目链接
  13. atitit.spring3 mvc url配置最佳实践
  14. select回显异常
  15. Python3自然语言处理(5)——预处理
  16. JAVA端收集Liunx服务器 CPU 内存 磁盘使用率
  17. STM32 UART/USART初始化时钟使能
  18. 什么是 ASP.NET?
  19. 苹果手机usb共享网络连接ubuntu连接不上解决方案
  20. 为啥不用美元作为IPFS体系的激励?

热门文章

  1. springboot定时备份MYSQL_spring boot 定时备份数据库
  2. java 排队实现_java中的优先列队-PriorityQueue源码实现解析
  3. Python删除文件中含有特定值的行
  4. typec扩展坞hdmi没反应_HDMI+两个USB接口,让surface秒变办公神器?这个扩展坞真香...
  5. php自动发卡程序8.0_vfkphp
  6. linux用户个人的环境变量,linux下的变量以及系统和个人环境变量的配置文件
  7. php-5.4 升级到 php7.2
  8. 学习如何看懂SQL Server执行计划(一)——数据查询篇
  9. 为何HDFS是大数据分析的软肋
  10. 2015最新Linkedin人才趋势报告