(“ x =” + x)给出“ x = value”而不是“x=tostring”的原因如下。当评估“+”时,javascript首先收集操作数的原始值,然后根据每个原始类型确定是否应应用加法或串联。
所以,这就是您的想法
a + b: pa = ToPrimitive(a) if(pa is string) return concat(pa, ToString(b)) else return add(pa, Tonumber(b))
这就是实际发生的情况
a + b: pa = ToPrimitive(a) pb = ToPrimitive(b)* if(pa is string || pb is string) return concat(ToString(pa), ToString(pb)) else return add(Tonumber(pa), Tonumber(pb))
也就是说,toString应用于valueOf的结果,而不是原始对象。
*在字符串上下文中调用时,ToPrimitive确实会调用toString,但这不是这种情况,因为’+’不会强制执行任何类型上下文。



