此功能是否在任何环境中都明确检测到@@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;
}
}
答案 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.setPrototypeOf
或syntactic features为检测。