第一章:ES?现在与未来

特别说明,为便于查阅,文章转自https://github.com/getify/You-Dont-Know-JS

在你一头扎进这本书之前,你应当可以熟练地使用(在本书写作时)最近版本的JavaScript,也就是通常所说的 ES5(技术上讲是ES 5.1)。这里,我们打算好好谈谈即将到来的 ES6,同时放眼未来去看看JS将会如何继续进化。

如果你还在JavaScript上寻找信心,我强烈推荐你首先读一读本系列的其他书目:

  • 入门与进阶:你是编程和JS的新手吗?这就是你在开启学习的旅程前需要查看的路线图。
  • 作用域与闭包:你知道JS的词法作用域是基于编译器(不是解释器!)语义的吗?你能解释闭包是如何成为词法作用域和函数作为值的直接结果的吗?
  • this与对象原型:你能复述this绑定的四个简单规则吗?你有没有曾经在JS中对付着去山寨“类”,而不是采取更简单的“行为委托”设计模式?你听说过 链接到其他对象的对象 (OOLO)吗?
  • 类型与文法:你知道JS中的内建类型吗?更重要的是,你知道如何在类型之间正确且安全地使用强制转换吗?你对JS文法/语法的微妙之处感到有多习惯?
  • 异步与性能:你还在使用回调管理你的异步处理吗?你能解释promise是为什么/如何解决了“回调地狱”的吗?你知道如何使用generator来改进异步代码的易读性吗?到底是什么构成了JS程序和独立操作的成熟优化?

如果你已经读过了这些书目而且对它们涵盖的内容感到十分轻松,那么现在是时候让我们深入JS的进化过程来探索所有即将到来的以及未来会发生的改变了。

与ES5不同,ES6不仅仅是向语言添加的一组不算太多的新API。它包含大量的新的语法形式,其中的一些你可能会花上相当一段时间才能适应。还有几种新的组织形式和为各种数据类型添加的新API。

对这门语言来说ES6十分激进。就算你认为你懂得ES5的JS,ES6也满是 你还不懂的 新东西,所以做好准备!这本书探索所有你需要迅速掌握的ES6主要主题,并且窥见一下那些你应当注意的正在步入正轨的未来特性。

警告: 这本书中的所有代码都假定运行在ES6+的环境中。在写作本书时,浏览器和JS环境(比如Node.js)对ES6的支持相当不同,因此你的感觉可能将会不同。

版本

JavaScript标准在官方上被称为“ECMAScript”(缩写为“ES”),而且直到最近才刚刚完全采用顺序数字来标记版本(例如,“5”代表“第五版”)。

最早的版本,ES1和ES2,并不广为人知也没有大范围地被实现。ES3是JavaScript第一次广泛传播的基准线,并且构成了像IE6-8和更早的Android 2.x移动浏览器的JavaScript标准。由于一些超出我们讨论范围的政治原因,命运多舛的ES4从未问世。

在2009年,ES5正式定稿(在2011年出现了ES5.1),它在浏览器的现代革新和爆发性增长(比如Firefox,Chrome,Opera,Safari,和其他许多)中广泛传播,并作为JS标准稳定下来。

预计下一个版本的JS(从2013年到2014年和之后的2015年中的内容),在人们的讨论中显然地经常被称为ES6。

然而,在ES6规范的晚些时候,有建议提及未来的版本号也许会切换到编年制,比如用ES2016(也叫ES7)来指代在2016年末之前被定稿的任何版本。有些人对此持否定意见,但是相对于后来的ES2015来说,ES6将很可能继续维持它占统治地位的影响力。可是,ES2016事实上可能标志了新的编年制。

还可以看到,JS进化的频度即使与一年一度的定版相比都要快得多。只要一个想法开始标准化讨论的进程,浏览器就开始为这种特性建造原型,而且早期的采用者就开始在代码中进行实验。

通常在一个特性被盖上官方承认的印章以前,由于这些早期的引擎/工具的原型它实际上已经被标准化了。所以也可以认为未来的JS版本将是一个特性一个特性的更新,而非一组主要特性的随意集合的更新(就像现在),也不是一年一年的更新(就像可能将变成的那样)。

简而言之,版本号不再那么重要了,JavaScript开始变得更像一个常青的,活的标准。应对它的最佳方法是,举例来说,不再将你的代码库认为是“基于ES6”的,而是考虑它支持的一个个特性。

转译

由于特性的快速进化,给开发者们造成了一个糟糕的问题,他们强烈地渴望立即使用新特性,而同时被被现实打脸 —— 他们的网站/app需要支持那些不支持这些特性的老版本浏览器。

在整个行业中ES5的方式似乎已经无力回天了,它典型的思维模式是,代码库等待几乎所有的前ES5环境从它们的支持谱系中除名之后才开始采用ES5。结果呢,许多人最近(在本书写作时)才开始采用strict模式这样的东西,而它早在五年前就在ES5中定稿了。

对于JS生态系统的未来来说,等待和落后于语言规范那么多年被广泛地认为是一种有害的方式。所有负责推动语言演进的人都渴望这样的事情;只要新的特性和模式以规范的形式稳定下来,并且浏览器有机会实现它们,开发者就开始基于这些新的特性和模式进行编码。

那么我们如何解决这个看起来似乎矛盾的问题?答案是工具,特别是一种称为 转译(transpiling) 的技术(转换+编译)。大致上,它的想法是使用一种特殊的工具将你的ES6代码转换为可以在ES5环境中工作的等价物(或近似物!)。

例如,考虑属性定义缩写(见第二章的“对象字面扩展”)。这是ES6的形式:

var foo = [1,2,3];

var obj = {
    foo     // 意思是 `foo: foo`
};

obj.foo;    // [1,2,3]

这(大致)是它如何被转译:

var foo = [1,2,3];

var obj = {
    foo: foo
};

obj.foo;    // [1,2,3]

这是一个微小但令人高兴的转换,它让我们在一个对象字面声明中将foo: foo缩写为foo,如果名称相同的话。

转译器为你实施这些变形,这个过程通常是构建工作流的一个步骤 —— 与你进行linting,压缩,和其他类似操作相似。

填补(Shims/Polyfills)

不是所有的ES6新特性都需要转译器。填补(也叫shims)是一种模式,在可能的情况下,它为一个新环境的行为定义一个可以在旧环境中运行的等价行为。语法是不能填补的,但是API经常是可以的。

例如,Object.is(..)是一个用来检查两个值严格等价性的新工具,它不带有===对于NaN-0值的那种微妙的例外。Object.is(..)的填补相当简单:

if (!Object.is) {
    Object.is = function(v1, v2) {
        // 测试 `-0`
        if (v1 === 0 && v2 === 0) {
            return 1 / v1 === 1 / v2;
        }
        // 测试 `NaN`
        if (v1 !== v1) {
            return v2 !== v2;
        }
        // 其他的一切情况
        return v1 === v2;
    };
}

提示:注意外部的if语句守护性地包围着填补的内容。这是一个重要的细节,它意味着这个代码段仅仅是为这个API还未定义的老环境而定义的后备行为;你想要覆盖既存API的情况是非常少见的。

有一个被称为“ES6 Shim”( https://github.com/paulmillr/es6-shim/ )的了不起的ES6填补集合,你绝对应该将它采纳为任何新JS项目的标准组成部分!

看起来JS将会继续一往无前的进化下去,同时浏览器也会持续地小步迭代以支持新特性,而不是大块大块地更新。所以跟上时代的最佳策略就是在你的代码库中引入填补,并在你的构建流程中引入一个转译器步骤,现在就开始习惯新的现实。

如果你决定维持现状,等待不支持新特性的所有浏览器都消失才开始使用新特性,那么你将总是落后于时代。你将可悲地错过所有新发明的设计 —— 而它们使编写JavaScript更有效,更高效,而且更健壮。

复习

ES6(有些人可能会称它为ES2015)在本书写作时刚刚定稿,它包含许多你需要学习的新东西!

但更重要的是,它将你的思维模式与JavaScript新的进化方式相接轨。不是仅仅为了等待某些官方文档投票通过而耗上许多年,就像以前许多人做的那样。

现在,JavaScript特性一准备好就会在浏览器中实现,由你来决定是否现在就搭上早班车,还是去玩儿代价不菲的追车游戏。

不管未来的JavaScript采用什么样的标签,它都将会以比以前快得多的速度前进。为了使你位于在这门语言前进方向上的最前列,转译和填补是不可或缺的工具。

如果说对于JavaScript的新现实有什么重要的事情需要理解,那就是所有的JS开发者都被强烈地恳求从落后的一端移动到领先的一段。而学习ES6就是这一切的开端!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容