Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在JavaScript中可以从另一个日期对象中减去一个日期对象?_Javascript - Fatal编程技术网

为什么在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'
看起来像什么?它是一个对象,而不是一个数字。请不要过于简单化。