EcmaScript-6向后兼容性

时间:2015-05-10 07:56:04

标签: javascript ecmascript-6 backwards-compatibility ecmascript-5

我很想知道/弄清楚ECMAScript-6的新变化是否适用于旧浏览器。

为什么我问这个问题是:

我记得在ECMAScript-5中引入了'use strict';,它是为了与旧版本兼容。

这意味着旧浏览器将继续正常运行,并且在解析新JavaScript代码时遇到'use strict';语句时会忽略它。

新的JS引擎将以某种特殊的方式处理语句'use strict';,详见Strict mode

所以,提出问题

我非常怀疑并且很想知道符合ECMAScript-5的浏览器在解析ECMAScript-6代码时会如何表现。

我怀疑的原因是ECMAScript-6新功能涉及语法更改/更新。旧的浏览器 new-syntax-unaware-engines 会在遇到以下任何新语法时开始抛出错误

yield[*], Map, Set, WeakMap, function* foo(){}, =>, for...of etc.

我担心的是ECMAScript-6中的新功能的决定/包含是否支持旧浏览器而没有任何代码中断?

如果是那么如何?

如果不那么我应该怎样做才能让我的旧浏览器用户满意?

我看到一个解决方案,通过在我的项目中包含transpiler traceur-compiler之类的are handled like subqueries来让使用旧版浏览器的用户满意。这会将我的ECMAScript-6代码转换为ECMAScript-5等效代码。但是,我还有其他任何解决方案可以让我的旧浏览器用户高兴吗?

2 个答案:

答案 0 :(得分:7)

许多ES6功能在ES5 JS引擎中不起作用,尤其是新的语法功能,如for/of或箭头函数,生成器等等。某些功能(如Set对象)可以部分填充旧版浏览器,其他人不能。

您问题中的功能列表:

yield[*], Map, Set, WeakMap, function* foo(){}, =>, for...of

这些都与旧版本的Javascript兼容,并且会导致语法或引用错误。 MapSet的某些特征可以是polyfilled(尽管不是全部)。产量,生成器,箭头函数和for ...只是旧浏览器不处理且无法执行的新语法。可以使用ES6转换器将代码转换为ES5兼容代码。这不是真正的ES6向后兼容性,而是仅使用ES5语法来完成与新ES6语法中表达的相同事物的代码转换。其中一些是使用polyfill完成的,有些是使用ES5代码(通常更多的ES5代码)表达ES6构造的替代方法。

如果您的代码运行在类似node.js的内容中,或者它是特定浏览器特定版本的插件,那么您可以更好地控制JS引擎,并且可能比使用ES6更快地使用ES6功能。一个浏览器。

如果您的代码在浏览器中运行,并且您没有使用转换程序转换为ES5代码,那么在互联网上使用的大多数浏览器都准备好ES6之前,这将是一段时间(多年)。

"use strict";的不同目的(删除对不良做法的支持)与允许与旧版本兼容而不是像生成器这样的新语言功能更为一致,因为"use strict";构造被特别选择为一个新的浏览器可以检测到,但较旧的浏览器只会看到一个普通的字符串。代表新语言语法的新ES6功能根本不是那种方式,因为旧版浏览器不知道如何处理它们,即使它们可能以某种方式忽略新语法,它们也不支持新语法的功能暗示。

您可能会发现本文非常有用,它讨论了今天尝试使用ES6时的一些问题:

ECMAScript 6 Resources For The Curious JavaScripter

如果您想在各种浏览器中使用大多数ES6功能,那么您最好的选择可能就是使用BabelJS这样的代码来转换您的代码。这会将您的ES6代码转换为可在任何ES5浏览器中运行的ES5兼容代码。您可以使用ES6编写代码,但代码将在各种浏览器中运行。

或者,如果您只在特定环境(例如该浏览器的特定版本的浏览器插件)或特定运行时引擎(如node.js)中运行,那么您可以编写代码使用特定引擎中已支持的ES6功能。

答案 1 :(得分:4)

您在此尝试解释的是向前兼容性。显然ES 5(或更确切地说是ES 5引擎)不向前兼容。无论如何都很难找到并且很难找到。

虽然您可以看到即将推出的ES 7的某些功能已经用完,因此可能会考虑这些增强功能来实现ES 6的引擎。因此,每当ES 7出现时,一些功能将在旧引擎中运行。 回答问题,ES 6向后兼容将是"是"。是! ES 6的引擎很乐意运行ES 5的代码,但反之亦然。