Javascript EcmaScript-6向后兼容性

Javascript EcmaScript-6向后兼容性,javascript,ecmascript-6,backwards-compatibility,ecmascript-5,Javascript,Ecmascript 6,Backwards Compatibility,Ecmascript 5,我很想了解/弄清楚ECMAScript-6的新更改是否能在旧浏览器上运行 我问这个问题的原因是: 我记得“使用严格”的介绍在ECMAScript-5中,它是为了与旧版本兼容 这意味着旧的浏览器将保持良好的工作状态,当遇到“use strict”时,它们将忽略它语句 新的JS引擎将处理语句“use strict”以此处详述的某种特殊方式 那么,说到问题 我对ECMAScript-5兼容浏览器在解析ECMAScript-6代码时的行为表示严重怀疑和好奇 我怀疑的原因是ECMAScript-6的新特

我很想了解/弄清楚ECMAScript-6的新更改是否能在旧浏览器上运行

我问这个问题的原因是:

我记得
“使用严格”的介绍
在ECMAScript-5中,它是为了与旧版本兼容

这意味着旧的浏览器将保持良好的工作状态,当遇到
“use strict”时,它们将忽略它语句

新的JS引擎将处理语句
“use strict”以此处详述的某种特殊方式


那么,说到问题

我对ECMAScript-5兼容浏览器在解析ECMAScript-6代码时的行为表示严重怀疑和好奇

我怀疑的原因是ECMAScript-6的新特性涉及语法更改/更新。旧的浏览器是新的语法不知道引擎,当它们遇到下列任何新语法时,就会开始抛出错误

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

我关心的是ECMAScript-6中新特性的决定/包含是否考虑到了在不中断代码的情况下支持旧浏览器

如果是那么如何

如果没有那么我该怎么做才能让我的老浏览器用户满意呢


我看到了一个解决方案,通过在我的项目中加入一些类似的内容,让使用旧浏览器的用户感到满意。这将把我的ECMAScript-6代码转换为等效的ECMAScript-5。但是我有没有其他解决方案可以让我的老浏览器用户满意呢?

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

您在问题中拥有的功能列表:

yield[*], Map, Set, WeakMap, function* foo(){}, =>, for...of
所有这些都与旧版本的Javascript不兼容,并且会导致语法或引用错误。
Map
Set
的某些特征可以进行多重填充(尽管不是全部)。Yield、generators、arrow函数和for…of只是旧浏览器无法处理和执行的新语法。可以使用ES6 transpiler将代码转换为与ES5兼容的代码。这并不是真正的ES6向后兼容性,而是一种代码转换,它只使用ES5语法来完成与新的ES6语法相同的事情。其中一些是通过polyfills完成的,另一些是通过仅使用ES5代码(通常是更多ES5代码)表达ES6构造的替代方法完成的

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

如果您的代码在浏览器中运行,并且您没有使用transpiler转换为ES5代码,那么在internet上使用的大多数浏览器都准备好ES6之前,还需要一段时间(很多年)

《规范》“严格使用”的不同目的(删除对不良做法的支持)与允许与旧版本兼容比新的语言功能(如生成器)更一致,如
“使用严格”构造被特别选择为新浏览器可以检测到的内容,但旧浏览器只能将其视为普通字符串。代表新语言语法的新ES6功能并非如此,因为旧的浏览器不知道如何处理它们,即使它们可能会以某种方式忽略新语法,它们也不支持新语法所暗示的功能

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

如果您现在想在各种浏览器中使用ES6的大部分功能,那么您最好的选择可能是使用类似的方式来传输代码。这将把您的ES6代码转换为可在任何ES5浏览器中运行的ES5兼容代码。您可以使用ES6编写代码,但代码将在各种浏览器中运行


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

许多ES6功能在ES5 js引擎中不起作用,特别是新的语法功能,如
for/of
或箭头函数、生成器等。。。。对于较旧的浏览器,某些功能(如Set对象)可以部分填充多边形,而其他功能则不能

您在问题中拥有的功能列表:

yield[*], Map, Set, WeakMap, function* foo(){}, =>, for...of
所有这些都与旧版本的Javascript不兼容,并且会导致语法或引用错误。
Map
Set
的某些特征可以进行多重填充(尽管不是全部)。Yield、generators、arrow函数和for…of只是旧浏览器无法处理和执行的新语法。可以使用ES6 transpiler将代码转换为与ES5兼容的代码。这并不是真正的ES6向后兼容性,而是一种代码转换,它只使用ES5语法来完成与新的ES6语法相同的事情。其中一些是通过polyfills完成的,另一些是通过仅使用ES5代码(通常是更多ES5代码)表达ES6构造的替代方法完成的

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

如果您的代码在浏览器中运行,并且您没有使用transpiler转换为ES5代码,那么在大多数浏览器运行之前需要一段时间(很多年)