2016-10-10 18 views
5

渡された引数がJavaScriptのインスタンスである場合、trueを返す関数を作成しています。MapオブジェクトがJavaScriptのマップであるかどうかを調べる

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

両方toStringが上書きされ、マップオブジェクトが別のフレームに由来する場合、それはtrue を返すようisMap機能を書くための方法はありますか?

+0

@Bergi、これは重複していますか?あなたの答えを支持して 'instanceof'を使用して私の質問は' instanceof'であなたがセットでチェックしている内部メソッドも持っている問題を述べ、 'Map'プロトタイプ(私は思う)には当てはまりません。 – robbmj

+0

これはセットとマップで全く同じです。私は正解になるように答えを編集するほうがいいと思う。 – Bergi

+0

@Bergi上記の編集を私のコメントに見てください。 – robbmj

答えて

2

Object.prototype.toString.call(new testWindow.Map)を確認できます。

これがオーバーライドされていると、おそらく運が悪いです。

+0

興味深いことに、私はそれにもかかわらず、私はそれが確かに1つの余分なステップを追加すると思います。 – robbmj

+0

私は 'toString'がオーバーライドされることについて心配するつもりはありません(あなたが最初に来たらそれをキャッシュすることができます)。しかし、' Symbol.toStringTag'については心配しません。 – Bergi

関連する問題