ES6 Map特性支持 - IE11中的支持是否太大?

3
我正在研究ES6的一些功能。为了查看可用性和使用位置,我使用以下链接:http://kangax.github.io/compat-table/es6/ 我使用Babel进行尝试:https://babeljs.io/repl 当我探索Map时,兼容性表格显示:

构造函数参数在IE11中不受支持

但我复制了示例代码:
var result = function() {
  var key1 = {};
  var key2 = {};
  var map = new Map([[key1, 123], [key2, 456]]);

  return map.has(key1) && map.get(key1) === 123 &&
         map.has(key2) && map.get(key2) === 456;
}();

console.log(result);

我在IE11上执行它,令我惊讶的是结果是truetrue 在Babel中也有(尽管Babel没有生成任何代码),在IE 11控制台中也是如此。

为什么会这样呢?

1个回答

2

我使用 Babel 进行试验:

https://babeljs.io/repl

这是 Babel 在 REPL 中使用其 Map polyfill。 如果您在 IE11 中运行该代码,原封不动地运行,您将得到false而不是true

var result = function() {
  var key1 = {};
  var key2 = {};
  var map = new Map([[key1, 123], [key2, 456]]);

  return map.has(key1) && map.get(key1) === 123 &&
         map.has(key2) && map.get(key2) === 456;
}();

console.log(result);

IE11的结果:

enter image description here


(在REPL中,如果你console.log(Map),它会显示function Map() { [native code] },这让我有些困惑。但是logansfmyth评论中很好地确认了,如果shimmed函数符合本地行为,Babel会这样做。)


谢谢。我在这里测试了一下,你是对的。但是,如果我打开Babel的页面并在多行模式下运行它,结果是true。这意味着Babel正在使用shim。相当具有误导性。 - dragonfly
@dragonfly: 好的,REPL 的作用是让你快速测试使用 Babel 转译后会得到什么。但是我必须说我不太确定他们在做什么,确切地说,看一下答案末尾的更新... :-) - T.J. Crowder
2
Babel确实进行了polyfill。[native code]是一个有争议的问题,但是目前core-js会这样做,以使具有本地行为的内容看起来像本地内容。 - loganfsmyth
@loganfsmyth:谢谢,那很有道理。我本应该明白不要相信函数的 toString - T.J. Crowder
@loganfsmyth:这是否意味着当我在构建管道中包含babel时,也需要包含整个core-js? - dragonfly
core-jsbabel-polyfill 的一部分,因此在加载 babel-polyfill 时它也会被包含进去。 - loganfsmyth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接