箭头函数

箭头函数使用=>语法来简化函数,在语句结构上和C#、Java 8 和 CoffeeScript类似,支持表达式和函数体。=>`操作符左边为输入的参数,而右边则是进行的操作以及返回的值。

var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {return num1 + num2;
};

关于this,绑定定义时所在的对象,而不是使用时所在的对象。

var handler = {id: "123456",init: function() {document.addEventListener("click",event => this.doSomething(event.type), false);},doSomething: function(type) {console.log("Handling " + type  + " for " + this.id);}
};

上面代码的init和doSomething方法中,都使用了箭头函数,它们中的this都绑定handler对象。否则,doSomething方法内部的this对象就指向全局对象,运行时会报错。
箭头函数有几个使用注意点。

1.函数体内的this对象,绑定定义时所在的对象,而不是使用时所在的对象。
2.不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
3.不可以使用arguments对象,该对象在函数体内不存在。

ES6中的类是基于面相对象模式的简单语法糖,拥有一个方便的声明形式,让类模式更容易使用。类支持原型继承、父类调用、实例、静态方法和构造函数。

class SkinnedMesh extends THREE.Mesh {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赋值、方法定义(省略function)、父类调用操作并能结合表达式计算属性名,这些使对象字面量更符合类的概念,在编写面向对象的JavaScript时更加轻松方便了。

var obj = {// __proto____proto__: theProtoObj,// Shorthand for ‘handler: handler’handler,// MethodstoString() {// Super callsreturn "d " + super.toString();},// Computed (dynamic) property names[ 'prop_' + (() => 42)() ]: 42
};

字符串模板

字符串模板是构建字符串的语法糖,这类似于Perl和Python中的字符串插值。允许在字符串中添加一个自定义标签,避免注入攻击或用字符串内容构建更高层次的数据结构。

模板字符串(template string)是增强版的字符串,即可以当作普通字符串使用,也可以在字符串中嵌入变量。它用反引号(`)标识。

// Basic literal string creation
`In JavaScript '\n' is a line-feed.`// Multiline strings
`In JavaScript this isnot 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
GET`http://foo.org/bar?a=${a}&b=${b}Content-Type: application/jsonX-Credentials: ${credentials}{ "foo": ${foo},"bar": ${bar}}`(myOnReadyStateChangeHandler);

解构

解构允许数组和对象使用模式匹配进行绑定。解构是故障弱化的,类似于标准对象以foo['foo']方式查找变量,当没有找到时返回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
var {op, lhs, rhs} = getASTNode()// Can be used in parameter position
function g({name: x}) {console.log(x);
}
g({name: 5})// Fail-soft destructuring
var [a] = [];
a === undefined;// Fail-soft destructuring with defaults
var [a = 1] = [];
a === 1;

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

现在可以在定义函数的时候指定参数的默认值了,而不用像以前那样通过逻辑或操作符来达到目的了。

function sayHello(name){//传统的指定默认参数的方式var name=name||'dude';console.log('Hello '+name);
}
//运用ES6的默认参数
function f(x, y=12) {// y is 12 if not passed (or passed as undefined)return x + y;
}
f(3) == 15
sayHello();//输出:Hello dude
sayHello('Wayou');//输出:Hello Wayou

如果传递的实参个数超过函数定义的形参个数,则可用通过arguments对象来访问。ES6支持不定参数的概念,不定参数是在函数中使用命名参数同时接收不定数量的未命名参数,格式是三个句点后跟代表所有不定参数的变量名。

function f(x, ...y) {// y is an Arrayreturn x * y.length;
}
f(3, "hello", true) == 6

拓展参数则是另一种形式的语法糖,它允许传递数组或者类数组直接做为函数的参数而不用通过apply

function f(x, y, z) {return x + y + z;
}
// Pass each elem of array as argument
f(...[1,2,3]) == 6

let+const

let用于定于块级作用域,const用于定义常量,其值不可改变。需要注意的是,let声明的变量不存在“变量提升”现象。

function f() {{let x;{// okay, block scoped nameconst x = "sneaky";// error, constx = "foo";}// error, already declared in blocklet x = "inner";}
}

for...of 值遍历

for...in在遍历时是遍历对象或数组的键,但是for...of则是遍历对象或数组的值。

var someArray = [ "a", "b", "c" ];for (v of someArray) {console.log(v);//输出 a,b,c
}for (r in someArray) {console.log(r);//输出 0,1,2
}

iterator+generator

具体内容可以参考这里:iterator, generator

  • iterator:它是这么一个对象,拥有一个next方法,这个方法返回一个对象{done,value},这个对象包含两个属性,一个布尔类型的done和包含任意值的value
  • iterable: 这是这么一个对象,拥有一个obj[@@iterator]方法,这个方法返回一个iterator
  • generator: 它是一种特殊的iterator。反的next方法可以接收一个参数并且返回值取决与它的构造函数(generator function)。generator同时拥有一个throw方法
  • generator 函数: 即generator的构造函数。此函数内可以使用yield关键字。在yield出现的地方可以通过generator的next或throw方法向外界传递值。generator 函数是通过function*来声明的
  • yield 关键字:它可以暂停函数的执行,随后可以再进进入函数继续执行

模块

在ES6标准中,JavaScript原生支持module了,将不同功能的代码分别写在不同文件中,各模块只需导出公共接口部分,然后通过模块的导入的方式可以在其他地方使用。

// lib/math.js
export function sum(x, y) {return x + y;
}
export var pi = 3.141593;// app.js
import * as math from "lib/math";
alert("2π = " + math.sum(math.pi, math.pi));// otherApp.js
import {sum, pi} from "lib/math";
alert("2π = " + sum(pi, pi));

支持export defaultexport *:

// lib/mathplusplus.js
export * from "lib/math";
export var e = 2.71828182846;
export default function(x) {return Math.log(x);
}// app.js
import ln, {pi, e} from "lib/mathplusplus";
alert("2π = " + ln(e)*pi*2);

模块加载器

模块加载器支持:

  • 动态加载(Dynamic loading)
  • 状态一致性(State isolation)
  • 全局空间一致性(Global namespace isolation)
  • 编译钩子(Compilation hooks)
  • 嵌套虚拟化(Nested virtualization)

默认的加载器是可以配置的,新的加载器能构建评估并在独立或受限的上下文中加载代码。

// Dynamic loading – ‘System’ is default loader
System.import('lib/math').then(function(m) {alert("2π = " + m.sum(m.pi, m.pi));
});// Create execution sandboxes – new Loaders
var loader = new Loader({global: fixup(window) // replace ‘console.log’
});
loader.eval("console.log('hello world!');");// Directly manipulate module cache
System.get('jquery');
System.set('jquery', Module({$: $})); // WARNING: not yet finalized

Map + Set + WeakMap + WeakSet

新加的集合类型,提供了更加方便的获取属性值的方法,同时,在进行属性值添加与获取时有专门的getset 方法。

// 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

Proxies

Proxies能用主对象的全部可用行为来创建对象,常用于监听、对象虚拟化、日志/分析等等

// Proxying a normal object
var target = {};
var handler = {get: function (receiver, name) {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是一种基本类型,像数字,字符串还有布尔一样,它不是一个对象。Symbol 通过调用symbol函数产生,它接收一个可选的名字参数,该函数返回的symbol是唯一的。之后就可以用这个返回值做为对象的键了。Symbol还可以用来创建私有属性,外部无法直接访问由symbol做为键的属性值。

var MyClass = (function() {// module scoped symbolvar 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

Math + Number + String + Array + Object API

对Math,Number,String还有Object等添加了许多新的API。

Number.EPSILON
Number.isInteger(Infinity) // false
Number.isNaN("NaN") // falseMath.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) // 3
[1, 2, 3].findIndex(x => x == 2) // 1
[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) })

更多信息见文尾的ES6 API扩展的链接。

二进制和八进制

ES6中新增了两种数字文字:binary (b) 和 octal (o),分别用前缀0b和0o表示。

0b111110111 === 503 // true
0o767 === 503 // true

Promises

Promises是处理异步操作的一种模式。当你发起一个异步请求,并绑定了.when(), .done()等事件处理程序时,其实就是在应用promise模式。

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)]);
})

原文:http://www.ido321.com/1596.html

相关文章:
ES6语言规范:ECMAScript® 2015 Language Specification
ES6介绍:ECMAScript 6 介绍
ES6兼容情况:compat-table-es6
ES6草案:es6-draft
ES6 API扩展:es6_api_extension
Promise对象:Promise对象
js异步编程:js异步编程的4中方式

ECMAScript 6新特性介绍相关推荐

  1. SAP PI 7.3新特性介绍

    PI 7.3新特性介绍 自从SAP TechEd  2010 年在Berlin对PI7.3的新特性作了介绍之后,类似于single Java Stack, central monitoring, ID ...

  2. Xcode9新特性介绍-中文篇

    背景: Xcode 9 新特性介绍: 1.官方原文介绍链接 2.Xcode9 be ta 2 官方下载链接 本文为官方介绍翻译而来,布局排版等都是按照官方布局来的. 与原文相比,排版上基本还是熟悉的配 ...

  3. ECMAScript 6新特性简介

    文章目录 简介 ECMAScript和JavaScript的关系 let和const 解构赋值 数组的扩展 函数的扩展 简介 ECMAScript 6.0(以下简称 ES6)是 JavaScript ...

  4. Angular8 - 稳定版修改概述(Angular 8的新特性介绍)

    Angular 8的新特性介绍 在之前Angular团队发布了8.0.0稳定版.其实早在NgConf 2019大会上,演讲者就已经提及了从工具到差分加载的许多内容以及更多令人敬畏的功能.下面是我对8. ...

  5. 技术前沿资讯-Apache Flink 1.14 新特性介绍

    一.简介 1.14 新版本原本规划有 35 个比较重要的新特性以及优化工作,目前已经有 26 个工作完成:5 个任务不确定是否能准时完成:另外 4 个特性由于时间或者本身设计上的原因,会放到后续版本完 ...

  6. hadoop3.0新特性介绍

    hadoop3.0新特性介绍 1. 基于jdk1.8(最低版本要求) 2. mr采用基于内存的计算,提升性能(快spark 10倍) 3. hdfs 通过最近black块计算,加快数据获取速度(块大小 ...

  7. chrome 63 android分类,Chrome 63 Beta新特性介绍

    原标题:Chrome 63 Beta新特性介绍 除非另外注明,否则,下面介绍的更改均适用于最新 Chrome Beta 渠道版(Android.Chrome 操作系统.Linux.Mac 和 Wind ...

  8. 蚂蚁金服 SOFAArk 0.6.0 新特性介绍 | 模块化开发容器...

    SOFAStack Scalable Open Financial Architecture Stack 是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里 ...

  9. JDK 9-17 新特性介绍

    Java新特性介绍 Java 8是Oracle 公司于 2014 年 3 月 18 日发布的,距离今天已经过了近十年的时间了,但是由于Java 8的稳定和生态完善(目前仍是LTS长期维护版本),依然有 ...

最新文章

  1. C#+AE 调整TOCControl控件中图层的显示顺序
  2. 一人一天发两篇Science,配视频揭秘:植物如何在与病菌的斗争中取胜?
  3. 并发编程之 锁的优化有哪些
  4. Python的交互式界面 编写 .
  5. 吃鸡服务器不接受响应,绝地求生:蓝洞优化服务器性能,从此告别掉帧延迟!...
  6. MySQL高级知识(二)——Join查询
  7. Axure使用图标字体
  8. Android Webview 设置Cookie问题
  9. 2.5.2 文法的二义性
  10. 浅论cherry机械键盘与其在war3中的表现
  11. 新型穿墙监控雷达Range-R:让你的隐私无所遁形(转)
  12. 关于Touch的顺时针(CW),逆时针(CCW)旋转
  13. JAVA面试八股文宝典(黑马学习随笔)-- 基础篇
  14. linux重装出现cannot load file 5555h,在安装系统出现error cannot load file code 5555h 的解决办法...
  15. (天池)超级码力在线编程大赛初赛 第2场
  16. css矩形外发光,CSS3 实现发光边框特效
  17. Mac安装单机版K8S
  18. AI云边端EasyCVR平台新功能解析:支持为角色选择多级分组
  19. IBM Personal System/2 —— 25年的PC历史
  20. javaswing员工工资系统java swing mysql 员工工资管理系统源码和导入文档(1014)

热门文章

  1. 该终端已停用_宣杭老线停用,勾庄、三墩、仓前、老余杭、瓶窑三千多亩地待开发...
  2. php打开文件对话框,JS打开选择本地文件的对话框
  3. yii2 html转换,能够将yii2的api以html文件导出,以及相关的测试
  4. Java selenium 读取网页
  5. jmeter 获取全部响应,jmeter中的正则表达式提取器-从响应中提取多个值.
  6. 20190914:(leetcode习题)验证二叉搜索树
  7. clickhouse数据字典
  8. hbase读写数据流程
  9. linux 下的挂载
  10. 官方钦定TensorFlow2.0要改这个API,用户吐槽:全世界都是keras