const a = { name: 'a', toString () { console.log(this); console.log('toString'); return { name: 'toString' }; }, valueOf () { console.log(this); console.log('valueOf'); return { name: 'valueOf' }; } }; a * 2; // {name: "a", toString: ƒ, valueOf: ƒ} // valueOf // {name: "a", toString: ƒ, valueOf: ƒ} // toString // Uncaught TypeError: Cannot convert object to primitive value a + ""; // {name: "a", toString: ƒ, valueOf: ƒ} // valueOf // {name: "a", toString: ƒ, valueOf: ƒ} // toString // Uncaught TypeError: Cannot convert object to primitive alert(a); // {name: "a", toString: ƒ, valueOf: ƒ} // toString // {name: "a", toString: ƒ, valueOf: ƒ} // valueOf // Uncaught TypeError: Cannot convert object to primitive value |
来看一下第一种情况:
const b = { [Symbol.toPrimitive] (hint) { console.log(`hint: ${hint}`); return {}; }, toString () { console.log('toString'); return 1; }, valueOf () { console.log('valueOf'); return 2; } }; alert(b); // hint: string b + ''; // hint: default b + 500; // hint: default +b; // hint: number b * 1; // hint: number |
const c = { toString () { console.log('toString'); return 1; }, valueOf () { console.log('valueOf'); return 2; } }; alert(c); // 打印出 toString 并 alert 出 1 c + ''; // 先后打印出 valueOf,"2" c + 500; // 先后打印出 valueOf,502 +c; // 先后打印出 valueOf,2 c * 1; // 先后打印出 valueOf,2 |
// output alert(obj); // using object as a property key anotherObj[obj] = 123; |
// explicit conversion let num = Number(obj); // maths (except binary plus) let n = +obj; // unary plus let delta = date1 - date2; // less/greater comparison let greater = user1 > user2; |
// binary plus let total = car1 + car2; // obj == string/number/symbol if (user == 1) { ... }; |