在 中console.log("hello " + obj);
,执行 is 的类型转换的运算符obj
,+
称为加法运算符。
在加法运算符中,不是将每个参数强制转换为字符串,而是将每个参数强制转换为没有类型提示的原始值。当对象被强制转换为没有类型提示的基元时,valueOf
如果可用,则使用该方法。仅当valueOf
不可调用或返回非原始值时才toString
使用。如果两者都valueOf
返回toString
非原始值,TypeError
则抛出 a。
引用规范:
http://es5.github.com/#x11.6.1
11.6.1 加法运算符(+)
1) 令 lref 为 AdditiveExpression 求值的结果。
2) 令 lval 为 GetValue(lref)。
3) 令 rref 为 MultiplicativeExpression 求值的结果。4) 设 rval 为 GetValue(rref)。5) 令 lprim 为 ToPrimitive(lval)。
6) 令 rprim 为 ToPrimitive(rval)。
7) 如果 Type(lprim) 是 String 或 Type(rprim) 是 String,那么
...
注 1在步骤 5 和 6 中对 ToPrimitive 的调用中没有提供任何提示。
http://es5.github.com/#x9.1
9.1 ToPrimitive
...
对象- 返回对象的默认值。通过调用对象的 [[DefaultValue]] 内部方法检索对象的默认值,并传递可选提示 PreferredType。本规范为 8.12.8 中的所有原生 ECMAScript 对象定义了 [[DefaultValue]] 内部方法的行为。
http://es5.github.com/#x8.12.8
8.12.8 [[DefaultValue]](提示)
当 O 的 [[DefaultValue]] 内部方法在没有提示的情况下被调用时,它的行为就好像提示是 Number 一样,除非 O 是 Date 对象(参见 15.9.6),在这种情况下,它的行为就好像提示是细绳。
...
当 O 的 [[DefaultValue]] 内部方法用提示 Number 调用时,采取以下步骤:
1) 令 valueOf 为使用参数“valueOf”调用对象 O 的 [[Get]] 内部方法的结果。
2) 如果 IsCallable(valueOf) 为真,则
- 令 val 为调用 valueOf 的 [[Call]] 内部方法的结果,其中 O 作为 this 值和一个空参数列表。
- 如果 val 是原始值,则返回 val。
...