模板字符串通过插值表达式${...}对值调用tostring()抽象操作实现转串,等价于string()或+'',支持自定义tostring(),但不自动json化或格式化。

模板字符串本身不会“自动转换”变量为字符串,而是通过 插值表达式(${...})内部执行隐式强制类型转换——这本质上是 JavaScript 对表达式求值后调用 ToString() 抽象操作的结果。
插值表达式内部会调用 ToString()
当你写 `Hello ${value}` 时,JavaScript 引擎会对 value 执行以下步骤:
- 对
${...}中的表达式求值(比如value是null、42、true或一个对象) - 将求得的值传入
ToString()抽象操作(ECMAScript 规范定义) - 得到对应的字符串表示,再拼接到模板中
例如:
`${null}` // → "null"<br>`${42}` // → "42"<br>`${true}` // → "true"<br>`${undefined}` // → "undefined"<br>`${{}}` // → "[object Object]"
与普通字符串拼接行为一致
这种转换逻辑和 String(value) 或 '' + value 完全相同,不是模板字符串独有的“魔法”。它只是利用了表达式求值 + 隐式转串的自然流程。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
`${123}`等价于String(123) -
`${[1,2]}`等价于String([1,2])→"1,2" -
`${Symbol('a')}`会抛出TypeError(Symbol 不能隐式转字符串)
自定义字符串表现?用 toString() 或 valueOf()
若想控制某个值在模板中如何显示,可为其对象定义 toString() 方法:
const obj = {<br> toString() { return 'Custom!'; }<br>};<br>console.log(`${obj}`); // → "Custom!"
注意:如果同时有 toString() 和 valueOf(),ToString() 操作优先使用 toString()(除非返回非字符串原始值)。
不支持自动 JSON 序列化或格式化
模板字符串不会把对象变成美观的 JSON 字符串,也不会格式化数字/日期:
-
`${{a:1}}`→"[object Object]",不是'{"a":1}' -
`${new Date()}`→ 依赖Date.prototype.toString(),结果如"Mon Apr 01 2024 10:20:30 GMT+0800 (China Standard Time)" - 需要 JSON:显式写
${JSON.stringify(obj)} - 需要格式化日期:用
toLocaleString()或Intl.DateTimeFormat
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










