为什么可以从JavaScript中的另一个日期对象中减去日期对象?

时间:2015-03-23 12:27:48

标签: javascript

请考虑以下代码:

var a = new Date(someDateString);
var b = new Date(someOtherDateString);

console.log(b - a); // Outputs for example 3572, number of millisecs between the dates

为什么这样做?这是对两个对象的算术运算。它看起来很像运算符重载,从C ++和其他语言中可以看出,但据我所知,JavaScript在ECMAScript 7之前不会得到它。

有人会认为JS引擎会把它变成类似

的东西
console.log(b.toString() - a.toString());

但是这会打印" NaN",因为日期对象上的toString返回格式为

的字符串
Mon Mar 23 2015 13:21:33 GMT+0100 (CET)

那么,这种算法有什么神奇之处呢?它可以在自定义对象上实现吗?

3 个答案:

答案 0 :(得分:4)

它通过.valueOf()而不是.toString()转换它们。在内部,日期存储为数字。 toString()方法只是使用日期格式化例程对其进行格式化。

请参阅规范中的The Subtraction Operator

答案 1 :(得分:1)

调用

valueOf来获取日期的数字基元:

function o(i) {
    this.valueOf = function() { return i; }
}

var a = new o(100);
var b = new o(42);

alert(a - b); // 58

答案 2 :(得分:0)

JS日期对象只是“毫秒”。

“零时间”从1970年1月1日00:00:00 UTC开始。其他一切都是简单的转换,添加/减少变得非常容易!