现在浏览器都支持es6吗
不是;ES6提供了许多新特性,但并不是所有的浏览器都能够完美支持,例如IE7~11版本基本不支持ES6,而Edge12-14仅支持部分ES6新特性;对ES6新特性最友好的是Chrome和Firefox浏览器,Chrome51版起便可以支持97%的ES6新特性,Firefox53版起便可以支持97%的ES6新特性。
本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。
ES6 提供了许多新特性,但并不是所有的浏览器都能够完美支持。好在目前各大浏览器自身也加快速度兼容 ES6 的新特性,其中对 ES6 新特性最友好的是 Chrome 和 Firefox 浏览器。
ES6语法对浏览器的兼容介绍
浏览器 | 不支持的版本 | 部分支持的版本 | 支持的版本 |
---|---|---|---|
IE | 6-10 | 11 | |
Edge | 12-14 | 15-18、79-87 | |
Firefox | 2-5 | 6-53 | 54-86 |
Chrome | 4-20 | 21-50 | 51-90 |
Safari | 3.1-7 | 7.1-9.1 | 10-13.1、14、TP |
Opera | 10-12.1 | 15-37 | 38-72 |
iOS Safari | 3.2-6.1 | 7-9.3 | 10-13.7、14.2 |
Opera Mini | all | ||
Android Browser | 2.1-4.3 | 4.4-4.4.4 | 81 |
Opera Mobile | 12-12.1 | 59 | |
Chrome for Android | 87 | ||
Firefox for Android | 83 | ||
UC Browser for Android | 12.12 | ||
Samsung Internet | 4 | 5-13.0 | |
QQ Browser | 10.4 | ||
Baidu Browser | 7.12 | ||
KaiOS Browser | 2.5 |
详细各个浏览器对ES6的支持性,可查看https://caniuse.com/?search=es6
想要知道自己的浏览器是否支持ES6,可查看http://ruanyf.github.io/es-checker/index.cn.html
桌面端浏览器对ES2015的支持情况
Chrome:51 版起便可以支持 97% 的 ES6 新特性。
Firefox:53 版起便可以支持 97% 的 ES6 新特性。
Safari:10 版起便可以支持 99% 的 ES6 新特性。
IE:Edge 15可以支持 96% 的 ES6 新特性。
Edge 14 可以支持 93% 的 ES6 新特性。(IE7~11 基本不支持 ES6)
可以看到IE11又拖了后腿,对ES6彻底放弃,由Edge 来支撑它的未来。
IE11下有效兼容ES6
那么如何让纯ES6脚本在IE11下运行呢,还是babel,提供了有效的解决办法
引入两个脚本:
https://cdn.bootcss.com/babel-core/5.8.35/browser.min.js
该脚本转换的是es6语法层面的语句
https://cdn.bootcss.com/babel-core/5.8.35/browser-polyfill.min.js
该脚本转换了新语法的API,比如Set Map Promise等的方法
标记脚本块的 type = "text/babel"
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>IE11 With ES6</title> <script src="./browser-polyfill.min.js"></script> <script src="./browser.min.js"></script> <script type="text/babel"> const list = ['one', 'two', 'three']; list.forEach((item, index) => { alert(item + (index + 1)); }); let promise = new Promise(function (resolve, reject) { alert('Promise'); resolve(); }); promise.then(function () { alert('resolved.'); }); const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]); alert(items.size) const map = new Map(); const k1 = ['a']; const k2 = ['a']; map.set(k1, 111).set(k2, 222); alert(map.get(k2)) </script> </head> <body> </body> </html>
那么这里有两个困惑:
第一:<script type="text/babel">
和我们平时用的<script type="text/javascript">
有什么区别。
第二:polyfill到底干了什么
我们分别来说明下,我们来看一个未压缩的代码:https://cdn.bootcss.com/babel-core/5.8.38/browser.js
发现如下几个代码片段:
//页面加载后,执行runScripts方法 if (global.addEventListener) { global.addEventListener("DOMContentLoaded", runScripts, false); } else if (global.attachEvent) { global.attachEvent("onload", runScripts); }
var runScripts = function runScripts() { var scripts = []; //识别类型 var types = ["text/ecmascript-6", "text/6to5", "text/babel", "module"]; var index = 0; /** * Transform and execute script. Ensures correct load order. */ var exec = function exec() { var param = scripts[index]; if (param instanceof Array) { transform.run.apply(transform, param); index++; exec(); } }; /** * Load, transform, and execute all scripts. */ var run = function run(script, i) { var opts = {}; if (script.src) { transform.load(script.src, function (param) { scripts[i] = param; exec(); }, opts, true); } else { opts.filename = "embedded"; scripts[i] = [script.innerHTML, opts]; } }; // Collect scripts with Babel `types`. var _scripts = global.document.getElementsByTagName("script"); //按照类别加载 for (var i = 0; i < _scripts.length; ++i) { var _script = _scripts[i]; if (types.indexOf(_script.type) >= 0) scripts.push(_script); } //执行 for (i in scripts) { run(scripts[i], i); } exec(); };
我想我们关注的text/babel就在这里:var types = ["text/ecmascript-6", "text/6to5", "text/babel", "module"];
获取页面上标记为以上三项的脚步,然后用transform库进行加载和翻译成ES5进行执行。
那么polyfill又干了什么呢,继续阅读代码https://cdn.bootcss.com/babel-core/5.8.38/browser-polyfill.js
同样定位到一段代码:
$export($export.P, 'Array', { // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg]) forEach: $.each = $.each || methodize(createArrayMethod(0)), // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg]) map: methodize(createArrayMethod(1)), // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg]) filter: methodize(createArrayMethod(2)), // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg]) some: methodize(createArrayMethod(3)), // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg]) every: methodize(createArrayMethod(4)), // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue]) reduce: createArrayReduce(false), // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue]) reduceRight: createArrayReduce(true), // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex]) indexOf: methodize(arrayIndexOf), // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex]) lastIndexOf: function(el, fromIndex /* = @[*-1] */){ var O = toIObject(this) , length = toLength(O.length) , index = length - 1; if(arguments.length > 1)index = Math.min(index, toInteger(fromIndex)); if(index < 0)index = toLength(length + index); for(;index >= 0; index--)if(index in O)if(O[index] === el)return index; return -1; } }); var createArrayReduce = function(isRight){ return function(callbackfn, memo){ aFunction(callbackfn); var O = IObject(this) , length = toLength(O.length) , index = isRight ? length - 1 : 0 , i = isRight ? -1 : 1; if(arguments.length < 2)for(;;){ if(index in O){ memo = O[index]; index += i; break; } index += i; if(isRight ? index < 0 : length <= index){ throw TypeError('Reduce of empty array with no initial value'); } } for(;isRight ? index >= 0 : length > index; index += i)if(index in O){ memo = callbackfn(memo, O[index], index, this); } return memo; }; };
可以发现ployfill给Arrary添加了很多新方法,比如createArrayReduce就是实现reduce用的。
注意
引入以上两个文件基本就解决了浏览器对ES6的大部分支持问题。
不过再次强调:即使使用了转换工具,还是不建议在生产环境大量地使用浏览器对ES6支持度较低的新特性的特性。毕竟这是在线转换后才执行的,效率比较低。而且随着浏览器对ES6的支持的变化,这些转换脚本也需要经常更新,势必对后期的维护带来影响。
【相关推荐:javascript视频教程、编程视频】
以上是现在浏览器都支持es6吗的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在ES6中,可以利用数组对象的reverse()方法来实现数组反转,该方法用于颠倒数组中元素的顺序,将最后一个元素放在第一位,而第一个元素放在最后,语法“array.reverse()”。reverse()方法会修改原始数组,如果不想修改需要配合扩展运算符“...”使用,语法“[...array].reverse()”。

async是es7的。async和await是ES7中新增内容,是对于异步操作的解决方案;async/await可以说是co模块和生成器函数的语法糖,用更加清晰的语义解决js异步代码。async顾名思义是“异步”的意思,async用于声明一个函数是异步的;async和await有一个严格规定,两者都离不开对方,且await只能写在async函数中。

步骤:1、将两个数组分别转为set类型,语法“newA=new Set(a);newB=new Set(b);”;2、利用has()和filter()求差集,语法“new Set([...newA].filter(x =>!newB.has(x)))”,差集元素会被包含在一个set集合中返回;3、利用Array.from将集合转为数组类型,语法“Array.from(集合)”。

为了浏览器兼容。ES6作为JS的新规范,加入了很多新的语法和API,但现代浏览器对ES6新特性支持度不高,所以需将ES6代码转为ES5代码。在微信web开发者工具中,会默认使用babel将开发者ES6语法代码转换为三端都能很好支持的ES5的代码,帮助开发者解决环境不同所带来的开发问题;只需要在项目中配置勾选好“ES6转ES5”选项即可。

在es6中,暂时性死区是一个语法错误,是指let和const命令使区块形成封闭的作用域。在代码块内,使用let/const命令声明变量之前,该变量都是不可用的,在变量声明之前属于该变量的“死区”;这在语法上,称为“暂时性死区”。ES6规定暂时性死区和let、const语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。

不是,require是CommonJS规范的模块化语法;而es6规范的模块化语法是import。require是运行时加载,import是编译时加载;require可以写在代码的任意位置,import只能写在文件的最顶端且不可在条件语句或函数作用域中使用;require运行时才引入模块的属性所以性能相对较低,import编译时引入模块的属性所所以性能稍高。

map是有序的。ES6中的map类型是一种储存着许多键值对的有序列表,其中的键名和对应的值支持所有数据类型;键名的等价性判断是通过调用“Objext.is()”方法来实现的,所以数字5与字符串“5”会被判定为两种类型,可以分别作为两种独立的键出现在程序中。