关于调用Date对象

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,我就有些不明白了。
下面图片截取自阮一峰教程
IMG_20200417_061919.jpg
按照规则,覆盖了原型的方法,优先调用我写的方法,那么应该调用对象自身的toString返回一个空对象,在调用返回的这个空对象的valueOf方法得到对象本身,最后相加,数据类型转换,我认为应该是[object Object]2才对啊!
可是第一段代码是符合预期的,第二段就看不明白运行规则了。
造成这种情况,是什么原因呢?又是为什么呢?求指点迷津,谢谢!
是不是优先调用obj的toString方法如果得到的不是原始类型,在调用obj的valueOf方法?

阅读 2.2k
3 个回答

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/...

是的,你在toString和valueOf中分别打印一个东西,就可以看到执行过程了

是吗,如果是数值运算应该优先调用valueOf吧。
(小声叨叨,这种就属于没必要去探究的东西,谁代码这样写呢。。。date要单独搞点不同的,即使记住了也没啥用吧,完全感觉不到。。。)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题