var obj = new Date();
obj.valueOf = function () { return 1 };
obj.toString = function () { return 'hello' };
obj + 2 // "hello2"
结果是hello2,我觉得没问题var obj = new Date();
obj.valueOf = function () { return 1};
obj.toString = function () { return {}};
obj + 2 //3
第二段代码,控制台打印结果是3,我就有些不明白了。
下面图片截取自阮一峰教程
按照规则,覆盖了原型的方法,优先调用我写的方法,那么应该调用对象自身的toString返回一个空对象,在调用返回的这个空对象的valueOf方法得到对象本身,最后相加,数据类型转换,我认为应该是[object Object]2
才对啊!
可是第一段代码是符合预期的,第二段就看不明白运行规则了。
造成这种情况,是什么原因呢?又是为什么呢?求指点迷津,谢谢!
是不是优先调用obj的toString方法如果得到的不是原始类型,在调用obj的valueOf方法?
Date对象会优先使用 toString 然后判断是否返回基本类型,如果是
object
会调用valueOf
,var obj = new Date();
obj.valueOf = function () { return 1};
obj.toString = function () { return {}};//这里你返回的object,改成基本类型
obj + 2 //3
你可以参考一下:
https://zhuanlan.zhihu.com/p/...