确定对象是否是JavaScript中的Map

时间:2016-10-10 15:51:49

标签: javascript instanceof typeof

如果传递给它的参数是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 />`);
}
&#13;
&#13;
&#13;

到目前为止一切顺利,但在测试帧之间的地图以及覆盖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函数,以便它返回true 何时覆盖toString并且地图对象来自另一个框架?

1 个答案:

答案 0 :(得分:3)

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

如果已被覆盖,那么你可能运气不好。