【问题标题】:Determining if an object is a Map in JavaScript [duplicate]确定一个对象是否是 JavaScript 中的 Map [重复]
【发布时间】:2017-02-19 02:23:00
【问题描述】:

如果传递给它的参数是 JavaScript Map 的实例,我正在编写一个返回 true 的函数。

正如您可能已经猜到的那样,typeof new Map() 返回字符串 object,而我们没有方便的 Map.isMap 方法。

这是我目前所拥有的:

function isMap(v) {
  return typeof Map !== 'undefined' &&
    // gaurd for maps that were created in another window context
    Map.prototype.toString.call(v) === '[object Map]' ||
    // gaurd against toString being overridden
    v instanceof Map;
}

(function test() {
  const map = new Map();

  write(isMap(map));

  Map.prototype.toString = function myToString() {
    return 'something else';
  };

  write(isMap(map));
}());

function write(value) {
  document.write(`${value}<br />`);
}

到目前为止一切都很好,但是在测试帧之间的映射以及toString() 已被覆盖时,isMap 失败 (I do understand why)。

例如:

<iframe id="testFrame"></iframe>
<script>
  const testWindow = document.querySelector('#testFrame').contentWindow;
  // false when toString is overridden 
  write(isMap(new testWindow.Map())); 
</script>

Here is a full Code Pen Demonstrating the issue

有没有办法编写isMap 函数使其返回truetoString 都被覆盖并且地图对象来自另一个框架时?

【问题讨论】:

  • @Bergi,这是怎么复制的?你的回答提倡使用instanceof 我的问题说明了我在instanceof 上遇到的问题,也是你在片场检查的内部方法,不适用于Map 原型(我认为)。
  • 集合和地图完全一样。我想我最好将答案编辑为规范。
  • @Bergi 请参阅上面的编辑,对我的评论。
  • 在此处查看my edit :-) 如果您不喜欢instanceof,可以使用其他方法 - 支持Map 而不是Set 只是选择正确的名称.
  • 注意,这个问题正在Meta讨论。

标签: javascript instanceof typeof


【解决方案1】:

您可以查看Object.prototype.toString.call(new testWindow.Map)

如果这已被覆盖,您可能不走运。

【讨论】:

  • 有趣,我没想到。我想它确实增加了一个额外的确定性步骤。
  • 我不担心toString 被覆盖(如果你先来,你可以缓存它),而是担心Symbol.toStringTag
猜你喜欢
  • 1970-01-01
  • 2018-05-06
  • 1970-01-01
  • 2016-12-27
  • 2010-11-13
  • 2014-07-13
  • 2017-11-04
  • 2016-05-19
  • 1970-01-01
相关资源
最近更新 更多