为了更好地舆解其工作道理,我们可以用 JavaScript 进内行单地实现:
我们可以简单覆写某个对象的 valueOf 办法,即可以发明其运算结不雅产生了变更:
- let obj = {
- valueOf:() => {
- return 0;
- }
- }
- obj + 1 // 1
如不雅我们强迫将某个对象的 valueOf 与 toString 办法都覆写为返回值为对象的办法,则会直接抛出异常。
- obj = {
- valueOf: function () {
- console.log("valueOf");
- return {}; // not a primitive
- },
- toString: function () {
- console.log("toString");
- return {}; // not a primitive
- }
- }
- obj + 1
- // error
- Uncaught TypeError: Cannot convert object to primitive value
- at <anonymous>:1:5
值得一提的是对于数值类型的 valueOf() 函数的调用结不雅仍为数组,是以数组类型的隐式类型转换结不蚜?鲋符串。而在 ES6 中惹人 Symbol 类型之后,JavaScript 会优先调用对象的 [Symbol.toPrimitive] 办法来将该对象转化为原始类型,那么办法的调用次序就变为了:
- 当 obj[Symbol.toPrimitive](preferredType) 办法存在时,优先调用该办法;
- 如不雅 preferredType 参数为 String,则依次测验测验 obj.toString() 与 obj.valueOf() ;
- 如不雅 preferredType 参数为 Number 或者默认值,则依次测验测验 obj.valueOf() 与 obj.toString() 。
而 [Symbol.toPrimitive] 办法的签名为: