2017-10-19 23 views
0

この機能はどんな環境でも@@toStringTagのサポートを確実に検出しますか?JavaScript:Symbol.toStringTagがサポートされているかどうかを検出します。

function hasToStringTagSymbol() { 
    if (Symbol && (typeof Symbol() == "symbol") && !!Symbol.toStringTag) { 
     var xTest = function() { }; 
     xTest.prototype[Symbol.toStringTag] = "Test"; 
     xTest = new xTest(); 
     return toString.call(xTest) == "[object Test]"; 
    } 
    else { 
     return false; 
    } 
} 
+0

キャッチすると予想されるシナリオごとにテストを書くことができますか? – Nope

+0

ecmascriptはサポートしていないブラウザがあるので、このシンボルを使用することが可能かどうかを検出する必要があります。 –

+0

あなたのテストの前に 'delete Symbol'を実行しましたが、シミュレートされていないでしょうか? – Nope

答えて

1

このコードでは、ポリフィルドが正しく検出されませんSymbol.toStringTagSymbolとその効果をtoStringにpolyfillすることは可能ですが(これは特にcore-jsによって行われます)、typeofの新しいプリミティブタイプを導入することは不可能です。上記のコードでは、Symbolも関数であることはテストされていません(実際には新しいシンボルを作成する必要はありません)。

それはより多くのようにする必要があります:

if (typeof Symbol !== "undefined" && Symbol && Symbol.toStringTag) { 
    var o = {}; 
    o[Symbol.toStringTag] = "Test"; 
    return toString.call(o) == "[object Test]"; 
} 

SymboltoStringに及ぼす影響を簡単にpolyfilledすることができます。開発者がアプリケーション内の特定のJS機能の後にある場合、少なくとも旧式のブラウザでは、ポリ充てんできないものに焦点を当てる方が良いかもしれません。 ES5の場合はObject.setPrototypeOf、ES6の場合はProxy、検出の場合はsyntactic featuresとなります。

関連する問題