在将对象转换为原始类型时有点不太懂
let obj = {
a: 'aaa',
valueOf() {
return 'valueOf';
},
toString() {
return 'toString';
}
};
console.log('' + obj); // valueOf
console.log(String(obj)); // toString
请问大佬们, 这两种转换obj的方式有什么不同吗?
javascript +运算符 执行算法
可以看到,在进行加法运算的时候,首先(步骤 5,6)要把运算符都转换为基本类型。
之后,如果(转换基本类型的结果中)一方是 string 的话,双方转换为 string (步骤7.a 7.b)。
在转换为基本类型的时候(步骤 5,6),除了 Date ,基本都是先尝试 valueOf ,在尝试 toString 的。
============
来自评论:
先看:
这里 valueOf 的返回不是字符串,而是通常是这个对象本身。它只执行了一个简单的操作:
Return ToObject(this)
。这个对象本身打印出来的时候,可能像是一个字符串,但并不是。对于一般的对象,ToPrimitive 会使用 OrdinaryToPrimitive(O, hint),其中 hint 是 number :
这个操作是用于转换为基本类型的,因而在 5.b.ii ,如果 valueOf 或 toString 返回的结果是一个 object ,那么就不会使用这个结果,而是继续尝试下一个。对普通 object ,转换为基本类型时,不会使用 valueOf 的结果(因为他是一个 object),而是会继续尝试 toString 。