JavaScript:检测是否支持Symbol.toStringTag

时间:2017-10-19 14:50:51

标签: javascript ecmascript-6 ecmascript-5

此功能是否在任何环境中都明确检测到@@toStringTag sefely的支持?

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;
    }
}

1 个答案:

答案 0 :(得分:1)

这段代码没有正确检测到polyfilled Symbol.toStringTag。虽然可以填充Symbol及其对toString的影响(特别是由core-js完成),但是不可能为{{1}引入新的原始类型}。上面的代码并没有测试typeof也是一个函数(它并不需要创建一个新符号)。

应该更像是:

Symbol

if (typeof Symbol !== "undefined" && Symbol && Symbol.toStringTag) { var o = {}; o[Symbol.toStringTag] = "Test"; return toString.call(o) == "[object Test]"; } 及其对Symbol的影响很容易被填充。如果开发人员在应用程序中使用特定的JS功能,那么最好将注意力集中在那些无法填充的功能上,至少在旧浏览器中是这样。 ES5为toString,ES6为Object.setPrototypeOfsyntactic features为检测。