确定对象是否是JavaScript中的Map

rob*_*bmj 5 javascript typeof instanceof

我正在编写一个函数,true如果传递给它的参数是JavaScript 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 />`);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都那么好,但是当测试帧之间的映射以及何时toString()被覆盖时,isMap失败(我明白为什么).

例如:

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

这是一个完整的Code Pen演示问题

有没有办法编写isMap函数,以便truetoString重写它们并且map对象来自另一个框架时它将返回?

SLa*_*aks 5

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

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