为什么在JavaScript中可以从另一个日期对象中减去一个日期对象?
考虑以下代码:为什么在JavaScript中可以从另一个日期对象中减去一个日期对象?,javascript,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++和其他语言中知道,但是据我所知,在AcMAScript 7之前,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++和其他语言中知道,但是据我所知,在AcMAScript 7之前,JavaScript将无法获得它。
有人会认为JS引擎会把它变成
console.log(b.toString() - a.toString());
但这会打印“NaN”,因为dateobject上的toString返回格式为的字符串
Mon Mar 23 2015 13:21:33 GMT+0100 (CET)
那么,是什么魔力使这个算法成为可能呢?它可以在自定义对象上实现吗?JS日期对象只是“毫秒数”
“零时间”从1970年1月1日UTC 00:00:00开始。其他一切都是简单的转换,加/减变得非常简单 它通过
.valueOf()
而不是.toString()
转换它们。在内部,日期存储为数字。toString()
方法只是使用日期格式化例程对其进行格式化
请参见规范中的。被调用以获取日期的数字原语:
function o(i) {
this.valueOf = function() { return i; }
}
var a = new o(100);
var b = new o(42);
alert(a - b); // 58
尝试实现它,看看会发生什么。JS引擎知道类型,JS充满了语法糖分和自动转换——这没有什么不同。滴答声,日期是通过一个数字表示的,基于一个起点(1/1/1970?),当从每个日期中减去日期时,就意味着从每个日期中减去滴答声,给您留下日期之间的差异…方法valueOf Date返回一个数字。当你执行减法时,日期obj被转换为数字。阅读ECMAScript 5.1规范,你会得到答案,结果会是什么,比如说
'2015-02-10'-'2014-10-12'
看起来像什么?它是一个对象,而不是一个数字。请不要过于简单化。