2017-10-19 76 views
0

此功能是否在任何環境下都能檢測到支持@@toStringTagJavaScript:檢測是否支持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

在測試之前'刪除符號',會不會模擬它不存在? – Nope

回答

1

這段代碼沒有正確檢測到polyfilled Symbol.toStringTag。雖然Symbol及其對toString的影響(特別是core-js完成)可能會被填充,但不可能爲typeof引入新的基本類型。上面的代碼不測試Symbol也是一個函數(它並不需要創建一個新的符號)。

它應該更像:

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

Symbol及其對toString效果可以很容易地polyfilled。如果開發人員在應用程序中使用了特定的JS功能,那麼最好將注意力集中在那些不能重複填充的功能上,至少在舊版瀏覽器中。它可以是針對ES5的Object.setPrototypeOf,針對ES6的Proxy或針對syntactic features的檢測。