Javascript 如何检测浏览器是否与ES2015兼容

Javascript 如何检测浏览器是否与ES2015兼容,javascript,ecmascript-6,Javascript,Ecmascript 6,我有大量的JS库,我应该重写,因为它们已经过时了。因此,我决定提出一个解决方案,在这个解决方案中,我将只使用ES2015的大部分功能,如 问题是,我相信所有的客户都不会有他们的浏览器是最新的,我不知道我是否会面临任何关于他们的浏览器是否与我的新JS LIB兼容的问题 因此,我想知道是否可以检测到客户端浏览器是否与ES2015兼容。如果没有,我只会包括我的旧JS库 我正在寻找一个类似的解决方案,但我找不到解决方案 非常感谢您对HTML、JS或PHP的任何帮助。请提出你的建议 我想知道是否可以检测到

我有大量的JS库,我应该重写,因为它们已经过时了。因此,我决定提出一个解决方案,在这个解决方案中,我将只使用ES2015的大部分功能,如

问题是,我相信所有的客户都不会有他们的浏览器是最新的,我不知道我是否会面临任何关于他们的浏览器是否与我的新JS LIB兼容的问题

因此,我想知道是否可以检测到客户端浏览器是否与ES2015兼容。如果没有,我只会包括我的旧JS库

我正在寻找一个类似的解决方案,但我找不到解决方案

非常感谢您对HTML、JS或PHP的任何帮助。请提出你的建议

我想知道是否可以检测到客户端浏览器是否 与ES2015兼容。如果没有,我只会包括我的旧JS 图书馆

你不能这么做,因为目前还没有完全支持ES2015的浏览器。另外,您也不想维护两个不同版本的代码,因为这很痛苦,而且很快就会变得混乱

现在的方法是使用transpiler,这是一种将ES2015代码编译成ES5(每个浏览器都知道的JavaScript)的编译器。这仍然有点混乱,但至少你只能编写一个版本的代码,这就是ES2015

我认为(以前是6to5)是最受欢迎的运输工具。您可以查看他们的网站以开始


至于回答你的实际问题,

如何检测浏览器是否与ES2015兼容

你可以用很多方法做到这一点。我不确定什么是最可靠的,但例如,您可以在浏览器的控制台上尝试:

'Promise' in window
如果此语句返回
true
,则当前浏览器支持Promissions,这是ES2015的一项新功能,因此您可以假设它支持ES2015的大部分功能

然而,这对于大多数情况来说是不够的;您可能希望100%确保您正在使用的内容不会在任何旧浏览器中抛出
SyntaxError

解决方案可以是手动检查您想要使用的每个功能。例如,如果需要Fetch API,可以创建一个函数,告诉您当前浏览器是否支持该API:

function isFetchAPISupported() {
    return 'fetch' in window;
}
您可以为任何需要的新API执行此操作。然而,如果您需要语法上不同的东西,我认为您唯一的赌注是
eval()
(正如Katana314所建议的)。例如,要检查对rest参数的支持,可以执行以下操作:

function isRestSupported() {
    try {
        eval('function foo(bar, ...rest) { return 1; };');
    } catch (error) {
        return false;
    }
    return true;
}
这在Firefox中非常有效,因为支持rest参数。
它在Safari上也能正常工作,返回
false
,因为那里还不支持rest参数。

目前还没有与整个ES2015兼容的浏览器。看看好问题。对于初学者,我认为最好将其作为依赖项管理器配置应用,以便加载脚本的备用版本。至于检测,我想知道最简单的方法是否是
eval(“函数(a,b,…args){}”),并检查语法错误。当然,提醒你“eval是邪恶的”,但如果你记住只对精确的内联字符串使用它,可能会更安全一些。许多ES6功能不能简单地进行多重填充,因为它是新语法,所以你需要有两个版本的所有代码;一个ES6版本和一个旧版本(可能使用Babel从ES6版本编译而来?)。功能检测必须在
try..catch
中完成,因为如果不支持它,它将抛出错误。但是,您可以使用垫片将代码升级到ES5,这意味着您只有一个代码库。如果此语句返回true,则浏览器与ES2015“兼容”。那是错误的。这意味着浏览器只提供本机承诺。但是,如果
isRestSupported
返回
true
,您会怎么做?在不受支持的浏览器中使用rest语法将在解析而不是执行超过一次时引发语法错误likely@RGraham在我的评论中,我提到必须为其配置依赖项管理器。例如,
partOfApp.js
partOfApp_ES5.js
。后者可能只是一个警告,如果它不是一个常见的访问站点,那么它会说“获取一个更新的浏览器,hick!”。@Katana314因此,如果浏览器支持rest,但不支持param默认值,并且支持的每个排列,那么每个附加功能都需要一个文件?在现有设备上使用巴别塔更容易codebase@RGraham好吧,我不能说出OP不使用某种transpiler的原因;他们显然有一些他们正在考虑的计划。