试一试
console.log(Symbol("desc").toString());
// Expected output: "Symbol(desc)"
console.log(Symbol.iterator.toString());
// Expected output: "Symbol(Symbol.iterator)
console.log(Symbol.for("foo").toString());
// Expected output: "Symbol(foo)"
// console.log(Symbol('foo') + 'bar');
// Expected output: Error: Can't convert symbol to string
语法
js
toString()
参数
无。
返回值
一个表示指定符号值的字符串。
描述
Symbol 对象覆盖了 Object 的 toString 方法;它不继承 Object.prototype.toString()。对于 Symbol 值,toString 方法以 "Symbol(description)" 的形式返回一个描述性字符串,其中 description 是符号的 描述。
toString() 方法要求其 this 值是一个 Symbol 原始值或包装对象。对于其他 this 值,它会抛出 TypeError,而不会尝试将其强制转换为符号值。
因为 Symbol 有一个 [Symbol.toPrimitive]() 方法,所以在将 Symbol 对象 强制转换为字符串 时,该方法始终优先于 toString()。然而,因为 Symbol.prototype[Symbol.toPrimitive]() 返回一个符号原始值,而符号原始值在隐式转换为字符串时会抛出 TypeError,所以语言永远不会隐式调用 toString() 方法。要将符号转换为字符串,必须显式调用其 toString() 方法或使用 String() 函数。
示例
使用 toString()
js
Symbol("desc").toString(); // "Symbol(desc)"
// well-known symbols
Symbol.iterator.toString(); // "Symbol(Symbol.iterator)"
// global symbols
Symbol.for("foo").toString(); // "Symbol(foo)"
隐式调用 toString()
要使 JavaScript 隐式调用符号包装对象上的 toString() 而不是 [Symbol.toPrimitive]() 的唯一方法是先 删除 [Symbol.toPrimitive]() 方法。
警告:您在实践中不应该这样做。除非您确切地知道自己在做什么,否则切勿修改内置对象。
js
delete Symbol.prototype[Symbol.toPrimitive];
console.log(`${Object(Symbol("foo"))}`); // "Symbol(foo)"
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-symbol.prototype.tostring |
浏览器兼容性
加载中…