介绍

  ES6,也叫ECMAScript2015(以下统称ES6),是ECMAScript标准的最新版本。这个标准在2015年6月份被正式批准。ES6是js语言很有意义的一次更新,也是2009年ES5被标准化以来第一次重大的更新。主流javascript引擎中的这些新特性正在开发中。
  ES6特性完整版参见:ES6特性完整版说明
  ES6有以下这些新特性:

箭头函数

  使用=>表示function的简略版。这和C#,Java8,CoffeeScript的语法很像。它可以支持声明体和表达式体,并且表达式体会有一个返回值。不像普通函数,箭头函数和其上下文共享同一个词法作用域的this。
 (译者注:词法作用域即“静态作用域”,)

 // Expression bodies 表达式体
var odds = evens.map(v => v + 1);
/*v=>v+1相当于function(v){return v+1;}*/
var nums = evens.map((v, i) => v + i);
var pairs = evens.map(v => ({even: v, odd: v + 1})); // Statement bodies 声明体
nums.forEach(v => {
if (v % 5 === 0)
fives.push(v);
});
/*相当于nums.forEach(function (v) {
if (v % 5 === 0) fives.push(v);
});*/ // Lexical this 词法作用域的this
var bob = {
_name: "Bob",
_friends: [],
printFriends() {
this._friends.forEach(f =>
console.log(this._name + " knows " + f));
}
}

  ES2015的classes是在基于原型的面向对象模式中的一个简单的语法糖。它有一个简单的声明形式,使得类模式更易于使用,并且这种方式有益于互用性。classes支持基于原型的继承、父类方法的调用、实例化和静态方法、构造函数。
  (译者注:超级像后端语言。)

 class SkinnedMesh extends THREE.Mesh {//使用extends来表示继承
constructor(geometry, materials) {
super(geometry, materials);//父类的构造函数 this.idMatrix = SkinnedMesh.defaultMatrix();
this.bones = [];
this.boneMatrices = [];
//...
}
update(camera) {
//...
super.update();
}
get boneCount() {
return this.bones.length;
}
set matrixType(matrixType) {
this.idMatrix = SkinnedMesh[matrixType]();
}
static defaultMatrix() {//静态方法
return new THREE.Matrix4();
}
}

增强的对象字面量

  对象字面量被扩展成可以在构造阶段设置原型、变量名和变量值相同时可以使用简写形式(如foo:foo 可以写成foo)、定义方法、调用父方法、动态计算变量名。同时,这种方式也和上一小节说的类(class)声明十分吻合,也使得基于对象的设计更加便利。

 var obj = {
// __proto__ obj的原型
__proto__: theProtoObj,
// Shorthand for ‘handler: handler’ 简写,翻译过来就是handler : handler,
handler,
// Methods
toString() {
// Super calls 调用父类的函数
return "d " + super.toString();
},
// Computed (dynamic) property names 需要计算的动态属性名称
[ 'prop_' + (() => 42)() ]: 42
};

字符串模板

  字符串模板提供了一个创建字符串的语法糖。这和perl、python等等语言中的字符串插入功能很类似。有选择性的,它允许在字符串中插入一个标签(tag)使得字符串的构建是可定制化的,这可以避免在字符串里进行注入攻击,或者构造更高级别的结构。

 // Basic literal string creation  基本的字符串字面量方式创建
`In JavaScript '\n' is a line-feed.` // Multiline strings 多行字符串
`In JavaScript this is
not legal.` // String interpolation 插入变量
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?` // Construct an HTTP request prefix is used to interpret the replacements and construction
// 构建一个通用的http请求前缀,其中字段值可以动态替换
POST`http://foo.org/bar?a=${a}&b=${b}
Content-Type: application/json
X-Credentials: ${credentials}
{ "foo": ${foo},
"bar": ${bar}}`(myOnReadyStateChangeHandler);

解构(解析结构)

  解构支持使用模式匹配来匹配数组和对象。结构是弱化失败的,类似于在一个标准的对象中查找foo[“bar”]属性,如果没有找到只是返回undefined。
  (译者注:fail-soft-字面意思是弱化失败,再这里是指如果解析结构解析不出来不会抛异常,只是返回一个undefined或默认值)

 // list matching 匹配数组
var [a, , b] = [1,2,3]; // object matching 匹配对象
var { op: a, lhs: { op: b }, rhs: c }
= getASTNode() // object matching shorthand 匹配对象的一部分
// binds `op`, `lhs` and `rhs` in scope 例如getASTNode()的返回值为{op,op2,lhs,rhs},这个表达式将会自动匹配op,lhs,rhs
/*稍微有点难懂,下面的语句翻译过来就是
var _getASTNode = getASTNode(); var op = _getASTNode.op;
var lhs = _getASTNode.lhs;
var rhs = _getASTNode.rhs;
*/
var {op, lhs, rhs} = getASTNode() // Can be used in parameter position 可以作为参数使用
function g({name: x}) {
console.log(x);
}
g({name: 5}) // Fail-soft destructuring 弱化解析失败,返回undefined
var [a] = [];
a === undefined; // Fail-soft destructuring with defaults 有默认值时弱化解析失败,返回undefiend
var [a = 1] = [];
a === 1;

默认值+不定参数+参数展开

  默认值:支持由被调用函数设置的参数默认值。
  参数展开:在函数调用时实参使用...运算符,可以将作为参数的数组拆解为连续的多个参数。 在函数定义时虚参使用...运算符,则可以将函数尾部的多个参数绑定到一个数组中。
  不定参数:不定参数取代了传统的参数,并可更直接地应用于通常的用例中。

 //默认值
function f(x, y=12) {
// y is 12 if not passed (or passed as undefined) 如果y没有实参,则赋值为默认值12
return x + y;
}
f(3) == 15
 //不定个数的参数
function f(x, ...y) {
// y is an Array 有...,表示y是一个数组
return x * y.length;
}
f(3, "hello", true) == 6
 //参数展开
function f(x, y, z) {
return x + y + z;
}
// Pass each elem of array as argument ...表示在数组中的每一个元素分别按顺序对应一个入参
f(...[1,2,3]) == 6

let和const关键字

  两个关键字都具有块级作用域,只在块级作用域中生效。let是一种新的var。(译者注:let可以看成var,它定义的变量被限制在特定范围中才能使用,离开这个范围就自动销毁)。const只能一次性声明(译者注:不能修改其值)。两者静态限制防止了在赋值前使用变量。

 function f() {
{
let x;
{
// okay, block scoped name 不报错
const x = "sneaky";
// error, const 报错,常量不允许修改值
x = "foo";
}
// error, already declared in block 报错,在该块级作用域中已经声明了
let x = "inner";
}
}

Iterator+For..Of 迭代器

  可以像CLR IEnumerable或JAVA Utterable一样自定义迭代器。将for..in 变为自定义且基于迭代器的for..of。不需要通过数组实现,可以像LINQ一样使用懒惰模式。

 let fibonacci = {
[Symbol.iterator]() {
let pre = 0, cur = 1;
return {
next() {
[pre, cur] = [cur, pre + cur];
return { done: false, value: cur }
}
}
}
} for (var n of fibonacci) {
// truncate the sequence at 1000 实现从1到1000的斐波那契数列计算
if (n > 1000)
break;
console.log(n);
}

迭代器是基于这些鸭子类型的接口(使用TypeScript类型语法,仅仅用于阐述问题)

 interface IteratorResult {
done: boolean;
value: any;
}
interface Iterator {
next(): IteratorResult;
}
interface Iterable {
[Symbol.iterator](): Iterator
}

Generators 生成器

  Generators 通过使用function和yield简化了迭代器编写。函数声明时如果是function 形式的会返回一个Generator实例。Generator是迭代器iterators的子类,还包括了额外的next和throw方法。这允许了值可以回流到生成器中,所以yield是返回一个值或者抛异常的一个表达式。

 var fibonacci = {
[Symbol.iterator]: function*() {
var pre = 0, cur = 1;
for (;;) {
var temp = pre;
pre = cur;
cur += temp;
yield cur;
}
}
} for (var n of fibonacci) {
// truncate the sequence at 1000
if (n > 1000)
break;
console.log(n);
}

生成器接口如下(此处使用TypeScript 的类型语法,仅用于阐述问题):

 interface Generator extends Iterator {
next(value?: any): IteratorResult;
throw(exception: any);
}

Unicode

  新增加的特性不影响老功能的使用,字符串将有新的文本格式,也增加了正则 u 模式来处理码位。同时,新的api可以在21码位级别上处理字符串。在javascript中,这些新增点可以支持构建全球化应用。

 // same as ES5.1
// 与 ES5.1 相同
"吉".length == 2 // new RegExp behaviour, opt-in ‘u’
// 使用可选的‘u’修饰符表示正则
"吉".match(/./u)[0].length == 2 // new form
// 左边是新写法,右边是旧写法。新的形式可以通过添加一组大括号`{}`来表示超过四字节的码点
"\u{20BB7}"=="吉"=="\uD842\uDFB7" // new String ops
"吉".codePointAt(0) == 0x20BB7 // for-of iterates code points
// 以码位为单位进行迭代
for(var c of "吉") {
console.log(c);
}

模块 modules

  在语言层面上支持使用模块来定义组件。将流行的javascript模块加载器(AMD,CommonJS)的模式编成规范。运行时的行为由宿主定义的默认加载器决定。隐式异步模型- (当前模块)没有代码会执行,直到被请求的模块可用且处理过。

 // lib/math.js
export function sum(x, y) { //export 表示可以被加载
return x + y;
}
export var pi = 3.141593;
 // app.js
import * as math from "lib/math"; //import 表示被导入
alert("2π = " + math.sum(math.pi, math.pi));
 // otherApp.js
import {sum, pi} from "lib/math";
console.log("2π = " + sum(pi, pi));

额外的新增的特征包括export default和export * ;

 // lib/mathplusplus.js
export * from "lib/math";
export var e = 2.71828182846;
export default function(x) {//注意default关键字表示默认
return Math.log(x);
}
 // app.js
import exp, {pi, e} from "lib/mathplusplus";
console.log("e^π = " + exp(pi));

Map + Set + WeakMap + WeakSet

  这四个对于常见的算法来说是很有用的数据结构。weakMaps这一数据结构提供的索引表,拥有不会发生内存泄露的对象键名。(注:指的是当对象作为键名时,对象可能会被回收,回收后自动移除所在键值对)。

 // Sets
var s = new Set();
s.add("hello").add("goodbye").add("hello");
s.size === 2;
s.has("hello") === true; // Maps
var m = new Map();
m.set("hello", 42);
m.set(s, 34);
m.get(s) == 34; // Weak Maps
var wm = new WeakMap();
wm.set(s, { extra: 42 });
wm.size === undefined // Weak Sets
var ws = new WeakSet();
ws.add({ data: 42 });
// Because the added object has no other references, it will not be held in the set
//因为这个新的对象没有其他引用,所以不会真的添加到set

Proxies 代理

  代理创建的对象可以获得宿主对象的全部行为(属性和方法)。可以用于拦截,虚拟对象,日志/分析等。

 // Proxying a normal object 代理一个普通对象
var target = {};//被代理的类
var handler = {//第二个参数表示拦截后的操作
get: function (receiver, name) {//这里是拦截获取属性的操作:p.world 相当于第二个参数name为world
return `Hello, ${name}!`;
}
}; var p = new Proxy(target, handler);
p.world === 'Hello, world!';
 // Proxying a function object 代理一个函数对象
var target = function () { return 'I am the target'; };
var handler = {
apply: function (receiver, ...args) {
return 'I am the proxy';
}
}; var p = new Proxy(target, handler);
p() === 'I am the proxy';

这里是所有运行时级别的元数据操作陷阱:

 var handler =
{
get:...,
set:...,
has:...,
deleteProperty:...,
apply:...,
construct:...,
getOwnPropertyDescriptor:...,
defineProperty:...,
getPrototypeOf:...,
setPrototypeOf:...,
enumerate:...,
ownKeys:...,
preventExtensions:...,
isExtensible:...
}

Symbols 符号

  symbol有权限控制对象状态。symbol允许通过String(与ES5相同)或symbol作为键来访问对象的属性。symbol是一个新的原始类型。可选的name参数用于调试-但是它不是符号身份的一部分。符号是唯一的(就像gensym),但是只要他们通过像Object.getOwnPropertySymbles这样的反射特性暴露出来,就不是私有的。

 var MyClass = (function() {

   // module scoped symbol
var key = Symbol("key"); function MyClass(privateData) {
this[key] = privateData;
} MyClass.prototype = {
doStuff: function() {
... this[key] ...
}
}; return MyClass;
})(); var c = new MyClass("hello")
c["key"] === undefined//已经跳出了作用域,所以是undefined

内建对象可拥有子类

在ES6中,像Array,Date和Dom元素这样的内建对象都可以被子类化。

 // User code of Array subclass
class MyArray extends Array {
constructor(...args) { super(...args); }
} var arr = new MyArray();
arr[1] = 12;
arr.length == 2

Math + Number + String + Object APIs

  加了一些新的api,包括math的核心库,数组转换帮助函数,和用来复制对象的Object.assign。 

 Number.EPSILON
Number.isInteger(Infinity) // false 是否是整形
Number.isNaN("NaN") // false 是否是非法数字 Math.acosh(3) // 1.762747174039086 余弦
Math.hypot(3, 4) // 5 直角三角形的斜边
Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2) // 2 带符号的惩罚 "abcde".includes("cd") // true
"abc".repeat(3) // "abcabcabc" Array.from(document.querySelectorAll('*')) // Returns a real Array
Array.of(1, 2, 3) // Similar to new Array(...), but without special one-arg behavior
[0, 0, 0].fill(7, 1) // [0,7,7]
[1, 2, 3].find(x => x == 3) //
[1, 2, 3].findIndex(x => x == 2) //
[1, 2, 3, 4, 5].copyWithin(3, 0) // [1, 2, 3, 1, 2]
["a", "b", "c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"]
["a", "b", "c"].keys() // iterator 0, 1, 2
["a", "b", "c"].values() // iterator "a", "b", "c" Object.assign(Point, { origin: new Point(0,0) }) //拷贝对象

Binary and Octal Literals

  增加了两个新的数字进制标识符,第二个字母为b来表示二进制,第二个字母为o来表示八进制。

 0b111110111 === 503 // true 二进制
0o767 === 503 // true 八进制

Promises

  Promises是处理异步操作的一种模式。 Promises是第一个能代表未来能用到的值的类。Promises已经被使用在很多JavaScript第三库中。

 function timeout(duration = 0) {
return new Promise((resolve, reject) => {
setTimeout(resolve, duration);
})
} var p = timeout(1000).then(() => {
return timeout(2000);
}).then(() => {
throw new Error("hmm");
}).catch(err => {
return Promise.all([timeout(100), timeout(200)]);
})

Reflect API

  完整的反射API暴露了对象在运行时的元操作。这类似于一个反向代理,并允许调用与代理陷阱中相同的元操作。实现代理非常有用。

 var O = {a: 1};
Object.defineProperty(O, 'b', {value: 2});
O[Symbol('c')] = 3; Reflect.ownKeys(O); // ['a', 'b', Symbol(c)] function C(a, b){
this.c = a + b;
}
var instance = Reflect.construct(C, [20, 22]);
instance.c; //

Tail Calls

  保证尾部调用时栈区不会没有限制的增长,这使得递归函数及时在没有限制的输入时也能保证安全性。

 function factorial(n, acc = 1) {
'use strict';
if (n <= 1) return acc;
return factorial(n - 1, n * acc);
}
// Stack overflow in most implementations today, 栈溢出在现在经常存在
// but safe on arbitrary inputs in ES6 但是在ES6中却很安全
factorial(100000)

learn ES6的更多相关文章

  1. 谈谈 React.js 的核心入门知识

    近来React.js变得越来越流行,本文就来谈一谈React.js的入门实践,通过分析一些常用的概念,以及提供一些入门 的最佳编程编程方式,仅供参考. 首先需要搞懂的是,React并不是一个框架,Re ...

  2. Arrow functions and the ‘this’ keyword

    原文:https://medium.freecodecamp.org/learn-es6-the-dope-way-part-ii-arrow-functions-and-the-this-keywo ...

  3. 20+ Docs and Guides for Front-end Developers (No. 5)

    It’s that time again to choose the tool or technology that we want to brush up on. If you feel like ...

  4. 每个JavaScript开发人员应该知道的33个概念

    每个JavaScript开发人员应该知道的33个概念 介绍 创建此存储库的目的是帮助开发人员在JavaScript中掌握他们的概念.这不是一项要求,而是未来研究的指南.它基于Stephen Curti ...

  5. Webpack+React+ES6开发模式入门指南

    React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React,组件化似乎不再步履蹒跚,有了Reac ...

  6. 6周学习计划,攻克JavaScript难关(React/Redux/ES6 etc.)

    作者:余博伦链接:https://zhuanlan.zhihu.com/p/23412169来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 和大家一样,最近我也看了Jo ...

  7. Webpack+React+ES6入门指南[转]

    React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React,组件化似乎不再步履蹒跚,有了Reac ...

  8. ES6新特性,对象的快速创建

    //es6对象快速赋值 //es5对象赋值 var name="xiaoming"; var age=18 var person={ name:name, age:age } co ...

  9. [翻译]Review——Learn these core JavaScript concepts in just a few minutes

    Learn these core JavaScript concepts in just a few minutes(只需几分钟即可学习这些核心JavaScript概念) 原文地址:https://m ...

随机推荐

  1. SQL--CLR概述

    Visual Studio 2005  支持在 SQL Server 2005 中开发.部署和调试托管代码.有一种新的项目类型(称为 SQL Server 项目),它允许开发人员在 SQL Serve ...

  2. EasyUI--Alert()

    1.$.messager.alert(title, msg, icon, fn) 2 <script type="text/javascript"> $(functio ...

  3. codeforces 540 C Ice Cave【BFS】

    题意:给出一个n*m的矩阵,“.”代表完整的冰,“X”代表破碎的冰,现在为了前进,需要掉下去一层,唯一的方法就是从破碎的冰上面掉下去 然后给出起点还有终点,问能否可达 即为到达终点的时候,终点必须是破 ...

  4. 洛谷1440 求m区间的最小值 单调队列

    题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入格式: 第一行两个数n,m. 第 ...

  5. Linux 常用命令:系统状态篇

    前言 Linux常用命令中,有些命令可以用于查看系统的状态,通过了解系统当前的状态,能够帮助我们更好地维护系统或定位问题.本文就简单介绍一下这些命令. 1. 查看系统运行时间--uptime 有时候我 ...

  6. Unity Shader (四)顶点程序示例

    1.在顶点函数中实现凸起效果 Shader "Custom/Example" { properties { _R(,))= //圆的半径,也是凸起的范围 _OX(,))= //x轴 ...

  7. 洛谷 P2005 A/B Problem II

    P2005 A/B Problem II 题目背景 为了让大家紧张的心情放松一下,这一题题是一道非常简单的题目. 题目描述 给出正整数N和M,请你计算N div M(N/M的下取整). 输入输出格式 ...

  8. WebSocket 笔记

    WebSocket介绍 WebSocket+Flask开启一个WebSocket服务 群聊小Demo 私聊小Demo WebSocket介绍 - 菜鸟教程详解连接 - 下载:pip install g ...

  9. BZOJ 1230 Usaco2008 Nov 开关灯 线段树

    思路: 用线段树模拟题中的操作就好 (标记异或 长度=区间总长度-当前已开灯的长度) //By SiriusRen #include <cstdio> using namespace st ...

  10. HDU 4372 Count the Buildings 组合数学

    题意:有n个点上可能有楼房,从前面可以看到x栋楼,从后面可以看到y栋,问楼的位置有多少种可能. 印象中好像做过这个题,