为什么算术运算在Javascript中的日期工作?

时间:2017-09-13 16:31:22

标签: javascript datetime

我已经在SO上阅读了this question,但是我在这里问为什么允许以下语义

采用以下Javascript示例:

window - window = NaN

window - document = NaN

new Date() - new Date() = 0
new Date / new Date() = 1
new Date * new Date() = 2.2659874948410516e+24

为什么这样做?这些代码段在Chrome控制台中执行,我对此处发生的事情有几个疑问:

首先,为什么在Javascript中甚至允许在Date上进行算术运算?它是一种特殊类型的物体,神奇地允许这些能力吗? Date甚至在内部被视为对象?为什么甚至强迫我们像普通对象一样创建一个Date()?

其次,减去或乘以两个日期甚至意味着什么?

第三,是Date唯一的例外,还是其他对象有这些“超级大国”(除了字符串),也可以在用户定义中复制代码?

2 个答案:

答案 0 :(得分:2)

您可以自己实施(是超人!)。在对象上使用+*-/尝试通过调用以下任一项将该对象转换为基元:

obj.toString() //if string is required
obj.valueOf() // if number is required

所以要做出这种行为,只需定义那些方法:

class one {
 valueOf(){ return 1; }
}

alert( new one + new one)//2

答案 1 :(得分:1)

JS支持一种基本形式的运算符重载,以便算术运算符在应用于对象时,调用其特殊的a = {}; a.valueOf = () => 1; b = {}; b.valueOf = () => 2; console.log(a + b)方法来获取数值:



Date




valueOf个对象定义valueOf,以便从纪元返回毫秒。

请注意- * /仅在"数字"中调用。上下文,+的情况,但不是Number的情况。如果您要在日期中添加内容,请先转换为today = new Date tomorrow = new Date(Number(today) + 24 * 3600 * 1000) console.log(tomorrow)



{ a: ['name 1'], b: [[1,2,3]] }