JavaScript对象加法运算转原始值的核心是[[ToPrimitive]]方法,优先调用toString(),失败再调用valueOf(),均未返回原始值则抛TypeError。

JavaScript 中对象在加法运算中转为原始值,核心是调用 [[ToPrimitive]] 内部方法,优先尝试 toString(),失败或返回非原始值时再调用 valueOf();若两者都未返回原始值,则抛出错误。
加法运算触发的转换逻辑
当加法(+)操作符的一个操作数是对象时,JS 引擎会按以下步骤将其转为原始值:
- 先以
"default"hint 调用对象的[[ToPrimitive]]方法 -
[[ToPrimitive]]默认策略是:先调用toString(),如果返回的是原始值(字符串、数字、布尔、null、undefined、symbol、bigint),就直接使用;否则再调用valueOf() - 若
toString()和valueOf()都返回非原始值(比如仍返回对象),则抛出TypeError
常见对象的默认转换结果
不同内置对象有各自的 toString 和 valueOf 实现,导致加法行为不同:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
普通空对象
{}:toString()返回"[object Object]"(字符串),所以{} + 1→"[object Object]1" -
数组
[1, 2]:toString()返回"1,2"(逗号拼接),所以[1, 2] + 3→"1,23" -
Date 对象:
toString()返回可读时间字符串,new Date() + ""→ 类似"Mon Apr 01 2024 10:20:30 GMT+0800 (CST)" -
自定义对象:若没重写方法,继承
Object.prototype.toString,结果仍是"[object Object]"
如何控制转换行为
你可以通过显式定义 toString() 或 valueOf() 来改变对象参与加法时的表现:
立即学习“Java免费学习笔记(深入)”;
- 只定义
toString()返回字符串 → 加法中优先转为此字符串 - 只定义
valueOf()返回数字(如return 42)→obj + 1得43 - 同时定义两者时,
toString()在"default"hint 下仍优先;但若加法中另一操作数是字符串(如obj + "x"),hint 仍是"default",不是"string",所以顺序不变 - 注意:
Symbol.toPrimitive方法可完全接管转换,优先级高于toString/valueOf,例如:obj[Symbol.toPrimitive] = () => "custom",则obj + 1→"custom1"
容易踩坑的情况
隐式转换常引发意外结果,需特别留意:
-
[] + []→""(两个空数组toString()都返回空字符串,拼接得空串) -
[] + {}→"[object Object]"(空数组转为空字符串,空对象转为"[object Object]",字符串拼接) -
{} + []在非严格模式下可能被解析为代码块 + 空数组,结果是0(因+[ ]被当作一元加号,转为空数组的valueOf()即0)——这是解析歧义,不是类型转换本身 - 自定义对象若
valueOf()返回对象,而toString()也返回对象(比如忘了 return),会直接报错

















