[关闭]
@wh1100717 2015-02-02T06:06:07.000000Z 字数 2447 阅读 503

ECMAScript 6 (二)

ECMAScript 数据大学


Symbols

通过Symbols我们可以实现Object对象的访问控制。我们知道对象其实是键值对的集合,而键可以是字符串(ES5)或者Symbol。Symbol是新的基本类型。

Symbol 通过调用Symbol()函数产生,它接收一个可选的名字参数name(主要用来进行调试,并不作为定义的一部分),该函数返回的symbol是唯一的。之后就可以用这个返回值做为对象的键了。Symbol还可以用来创建私有属性,外部无法直接访问由symbol做为键的属性值。

  1. (function() {
  2. // module scoped symbol
  3. var key = Symbol("key");
  4. function MyClass(privateData) {
  5. this[key] = privateData;
  6. }
  7. MyClass.prototype = {
  8. doStuff: function() {
  9. ... this[key] ...
  10. }
  11. };
  12. })();
  13. var c = new MyClass("hello")
  14. c["key"] === undefined

Subclassable Built-ins

在ES6中,内置的像 Array , Date 和 DOM 元素等可以用来作为基类。

被称为 Ctor 函数的对象构建经过两个阶段:

  1. // Array 伪代码
  2. class Array {
  3. constructor(...args) { /* ... */ }
  4. static [Symbol.create]() {
  5. // Install special [[DefineOwnProperty]]
  6. // to magically update 'length'
  7. }
  8. }
  9. // Array 基类的扩展
  10. class MyArray extends Array {
  11. constructor(...args) { super(...args); }
  12. }
  13. // 使用new的两个阶段:
  14. // 1) 调用@@create来分配对象
  15. // 2) 在新实例中唤醒构造函数
  16. var arr = new MyArray();
  17. arr[1] = 12;
  18. arr.length == 2

更多内容请参考 http://www.2ality.com/2013/03/subclassing-builtins-es6.html

Math + Number + String + Object APIs

在ES6中增加了许多新的API,包括核心Math库,Array conversion helpers,用于对象拷贝的Object.assign等。

  1. Number.EPSILON
  2. Number.isInteger(Infinity) // false
  3. Number.isNaN("NaN") // false
  4. Math.acosh(3) // 1.762747174039086
  5. Math.hypot(3, 4) // 5
  6. Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2) // 2
  7. "abcde".contains("cd") // true
  8. "abc".repeat(3) // "abcabcabc"
  9. Array.from(document.querySelectorAll('*')) // Returns a real Array
  10. Array.of(1, 2, 3) // Similar to new Array(...), but without special one-arg behavior
  11. [0, 0, 0].fill(7, 1) // [0,7,7]
  12. [1,2,3].findIndex(x => x == 2) // 1
  13. ["a", "b", "c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"]
  14. ["a", "b", "c"].keys() // iterator 0, 1, 2
  15. ["a", "b", "c"].values() // iterator "a", "b", "c"
  16. Object.assign(Point, { origin: new Point(0,0) })

Binary and Octal Literals

ES6中为二级制(b)和八进制(o)增加了两个新的数字字面量格式。

  1. 0b111110111 === 503 // true
  2. 0o767 === 503 // true

Promises

Promises是用来处理异步编程的库,已经有很多第三方库对其进行了来实现。

  1. //创建promise
  2. var promise = new Promise(function(resolve, reject) {
  3. // 进行一些异步或耗时操作
  4. if ( /*如果成功 */ ) {
  5. resolve("Stuff worked!");
  6. } else {
  7. reject(Error("It broke"));
  8. }
  9. });
  10. //绑定处理程序
  11. promise.then(function(result) {
  12. //promise成功的话会执行这里
  13. console.log(result); // "Stuff worked!"
  14. }, function(err) {
  15. //promise失败会执行这里
  16. console.log(err); // Error: "It broke"
  17. });

更多Promises信息请访问:

Tail Calls

尾部的函数调用保证了堆栈不会无限增长,使得递归算法在面对无限制输入时变得安全可靠。

  1. function factorial(n, acc = 1) {
  2. 'use strict';
  3. if (n <= 1) return acc;
  4. return factorial(n - 1, n * acc);
  5. }
  6. // 目前大部分的实现都会导致栈溢出
  7. // 但是在ES6中对于任意输入都是安全的。
  8. factorial(100000)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注