ECMAScript 6 未来前景
发布在深度解析 ES6 系列文章2015年11月20日view:1473ECMAScript 6
在文章任何区域双击击即可给文章添加【评注】!浮到评注点上可以查看详情。

未来前景

原文地址:http://wiki.jikexueyuan.com/project/es-six-deeply/future.html

这篇文章涵盖了十多个我们从未详细讨论过的新函数。我们可以把这当作在语言的豪宅中进行了一次有趣的游览,游览中我们参观了所有的壁橱和楼上奇形怪状的房间。也许有一两个超级大的地下洞穴。如果你还没有看过该系列的其他部分,请看这里;本部分未必是最好的开始的地方!

alt text”在你的左边,你可以看到类型数组……”

一个提前警告:许多下述功能还没有得到广泛的实施。好,让我们开始吧。

你已经使用的函数

ES6 标准化了一些先前使用其他标准或被广泛使用但并无标准的函数。

类型数组,缓冲数组和数据视图。这些都曾被标准化为 WebGL 的一部分,从那以后他们已经被应用于许多应用程序编程接口,包括画布、网络音频应用程序编程接口和网页实时通信。当你需要处理大量的原始二进制或数字数据时,使用它们会非常方便。 例如,如果画布渲染上下文对象而失去了你想要的特征并且你觉得自己充分掌握了它的核心,你便可以自己将它实现。

var context = canvas.getContext("2d");
var image = context.getImageData(0, 0, canvas.width, canvas.height);
var pixels = image.data;  // a Uint8ClampedArray object
// ... Your code here!
// ... Hack on the raw bits in `pixels`
// ... and then write them back to the canvas:
context.putImageData(image, 0, 0);

在标准化过程中,类型化数组重新取用了.slice(),.map()和.filter()方法。

Promises。只写一个有关 promises 的段落就像一口只吃一片薯片。无论这有多难,它都是一件几乎无意义去做的事情。怎么说呢?Promises 就像异步 JS 编程的基石,他们代表了将被使用的值。举个例子,当你调用fetch()函数而不是阻塞模式时,它会立即返回一个Promise 对象。Fetch 将进入后台工作,当反射代码出现时它会叫你回来。Promises 因链接工作的很好而比单独使用 callbacks 更胜一筹,他们是拥有着趣味操作的一类值,你可以样板文件更少的情况下拥有错误处理权。他们增强了浏览器的性能。如果你还不知道关于 promises 的所有,先去看看杰克·阿奇博尔德的深入探究文章。

块级作用域函数。你本不应该使用它,但在无意中你也许已经使用过了。 在 ES1-5 中,这段代码在技术上是非法的: 该函数在 if 块中声明被认为是非法的。

if (temperature > 100) {
  function chill() {
    return fan.switchOn().then(obtainLemonade);
  }
  chill();
}

他们只在顶层或函数的最外层块内合法。

但是可以说,它被用于所有主要浏览器。

不兼容。每个浏览器都有一点点不同,但它依然可以工作并且许多网页仍然在使用它。

谢天谢地,ES6 标准化了这一点。函数被提升到了封闭块的顶部。

不幸的是,Firefox 和 Safari 没有执行这项标准。所以就目前而言,使用函数表达式来代替。

if (temperature > 100) {
  var chill = function () {    
    return fan.switchOn().then(obtainLemonade);
  };
  chill();
}

块作用域函数没有在多年前就被标准化的唯一原因是向后兼容的限制极其复杂。没有人认为它能被解决。ES6 通过添加了一项非常奇怪的规则完成了这项艰巨的任务,这个规则就是仅适用于非严格代码。我无法解释它。相信我,使用严格的模式。

函数名。所有主要 JS 引擎还长期支持有名函数的一个非标准.name属性。ES6 把这标准化,通过为一些在此之前被认为无名的函数推断合理的.name,来将其变得更好。

> var lessThan = function (a, b) { return a < b; };
> lessThan.name
    "lessThan"

对于其他函数,如回调体现为.then的参数,该规范仍然没有制定一个名字。fn.name 便成了空字符串。

好的事情

对象 .assign(目标,…源码)。一个类似于 underscore 的 _.extend() 的新型标准库函数。

函数调用展开运算符。 早在五月,我们就推出了其余的参数。他们是函数的一个接收任意数量参数的方式,是随机、复杂难懂的参数对象的更文明的选择。

function log(...stuff) {  // stuff is the rest parameter.
  var rendered = stuff.map(renderStuff); // It's a real array.
  $("#log").add($(rendered));
}

我们没有说的是,有传递给函数任意数量参数的匹配语法,能够更文明的替代 fn.apply()。

// log all the values from an array
log(...myArray);

当然,它与任何可迭代对象一起工作,这样你就可以将所有东西记录在一个集里并记录为 log(… mySet)。

与其他参数不同的是,在单一的参数列表内多次重复使用展开运算符是有效的。

// kicks are before trids
log("Kicks:", ...kicks, "Trids:", ...trids);

展开运算符可以方便地扁平化数组中的一个数列。

> var smallArrays = [[], ["one"], ["two", "twos"]];
> var oneBigArray = [].concat(...smallArrays);
> oneBigArray
    ["one", "two", "twos"]

…但也许这是一个只有我渴求的迫切需要。如果是这样,我责怪哈斯克尔。

构造数组的展开运算符。同样追溯回五月,我们谈到了解构的“休息”模式。它们是从一个数列中获取任意数量元素的一种方法。

> var [head, ...tail] = [1, 2, 3, 4];
> head
    1
> tail
    [2, 3, 4]

猜猜发生了什么!竟然有把任意数量元素添加到一个数列中的匹配语法。

> var reunited = [head, ...tail];
> reunited
    [1, 2, 3, 4]

所有函数调用的展开运算符的使用规则都相同:你可以在同一数列中多次使用展开运算符等等。

合适的尾调用。这对于我来说太不可思议了,我试着在这里解释。 要想理解这个特征,最好从《计算程序的结构与解读》第一页开始了解。如果你喜欢它,就继续阅读下去。尾调用在1.2.1章节“线性递归与迭代”中得到了阐述。ES6 标准要求实现“尾递归”,这个名词在其中就有定义。

到现在为止还没有主要 JS 引擎对其进行实施,因为这比较难以实现。但是一切都很好。

正文

Unicode 版本升级。ES5 至少需要实现支持 Unicode 版本 3.0 的所有字符,ES6 至少需要实现支持 Unicode 版本 5.1.0 的所有字符。现在你可以使用Linear B中的字符来作为你的函数名了!

Linear A还是有一点冒险。一是因为直到 Unicode 版本 7.0 它才加入,二是因为很难保持用从未被破解的语言编写代码。

(即使在 JavaScript 引擎中支持在 Unicode 6.1 中加入表情符号,你也不能使用

评论
发表评论
1年前

@Kyrios 本来不打算仔细看文章的,结果一看你的评论,果断拖回去看了一下,笑屎了^_^

1年前

这尼玛是机器翻译的吧

WRITTEN BY
起名字凡人
前路变幻,不忘初心
TA的新浪微博
PUBLISHED IN
深度解析 ES6 系列文章

ECMAScript 6 简称 “ES6”,ES6 包含了很多新的语言功能,且这些语言功能使得 JavaScript 更加强大更富有表现力。下面我们将会一步步介绍 ES6 新增的那些功能。

适用人群 本书为中级难度,适合已有一定 JavaScript 语言基础的读者,用来了解这门语言的最新发展;也可当作参考手册,查寻新增的语法点。

我的收藏