JavaScript中对象与字符串相加时,对象先调用toString()转为原始值,若返回对象则调用valueOf(),否则报错;内置对象如Date、Array、Function等有合理默认行为,自定义对象可通过重写toString()控制结果。

JavaScript 中对象与字符串相加时,会自动触发隐式类型转换:对象先调用 toString() 方法转为字符串,再与另一字符串拼接。若 toString() 返回原始值(如字符串、数字),则直接使用;否则继续尝试 valueOf(),若仍不满足,则抛出错误。
对象转字符串的核心规则
当执行类似 obj + 'hello' 的操作时,JavaScript 按以下顺序尝试转换:
- 先调用
obj.toString(),如果返回的是原始值(string/number/boolean/null/undefined),就用这个结果 - 如果
toString()返回的是对象(比如没重写时的[object Object]),再调用obj.valueOf() - 若
valueOf()也返回对象,则报错TypeError: Cannot convert object to primitive value
常见内置对象的表现
多数内置对象已预设了合理的 toString() 行为:
-
new Date() + ''→"Mon Apr 01 2024 10:20:30 GMT+0800 (CST)" -
[1, 2, 3] + 'abc'→"1,2,3abc"(数组的toString()等价于join(',')) -
function(){ } + 'test'→"function(){ }test"(函数默认toString()返回源码字符串) -
/abc/g + 'x'→"/abc/gx"(正则对象也有可读字符串表示)
自定义对象如何控制拼接结果
可通过重写 toString()(推荐)或 valueOf() 来影响结果:
- 只重写
toString()即可满足字符串拼接需求:const obj = { toString() { return 'my-string'; } };<br>console.log(obj + 'suffix'); // "my-stringsuffix" - 若同时定义了
toString()和valueOf(),且都返回原始值,toString()优先用于字符串上下文 - 避免在
toString()中返回对象,否则可能触发valueOf()或报错
需要警惕的陷阱
某些看似自然的操作其实隐含风险:
-
null + ''→"null",undefined + ''→"undefined"(它们不是对象,但会被转成字符串) -
{}字面量在表达式开头会被解析为代码块而非对象,所以{} + '1'实际是; + '1'→"1";正确写法应加括号:({}) + '1'→"[object Object]1" - 数组里含
undefined或null时:[1, undefined, 3] + 'x'→"1,,3x"(undefined和null在join()中被转为空字符串)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











