javascript - 确定一个对象是否是 JavaScript 中的 Map

标签 javascript instanceof typeof

<分区>

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

正如您可能已经猜到的那样,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 都被覆盖并且 map 对象来自另一个框架时?

最佳答案

你可以检查Object.prototype.toString.call(new testWindow.Map)

如果它已被覆盖,您可能就不走运了。

关于javascript - 确定一个对象是否是 JavaScript 中的 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39962073/

相关文章:

javascript - 监听 CKEditor 对话框中的点击事件

javascript - 获取当前ES模块的文件名

c# - 在 C# 中使用 GetType/instanceof 与替代方案

java - 实体 Sprite 怪物实体实例...就这么简单但不起作用?

javascript - 如果函数不存在写函数 - javascript

javascript - 如何在 d3.js 中从上到下更改 X 轴线

javascript - 使用 JavaScript 提取 lang 值

javascript - 获取 Javascript 变量类型的更好方法?

Java使用instanceof和迭代器

javascript - 如何确定原生 JavaScript 对象是否具有属性/方法?