+ JavaScript中的日期运算符

时间:2013-12-19 10:35:02

标签: javascript

加号运算符('+')似乎在javascript中具有Date类型对象的多个函数。以下输入为+ t提供不同的输出:

var t = new Date();
console.log('the date is '+t);
console.log(+t);

对我来说更令人困惑的是它在这里没有转换为毫秒:

console.log(t+5);

特别是:

console.log(5+t);

自:

console.log(+t+5);

我很惊讶它将五个字符串视为字符串,并且'+ t'在+ t + 5和t + 5之间在语义上有所不同。

是否有参考资料,我可以找到哪些操作符对Date对象有什么影响?这样我就可以确信在每个浏览器中+的行为的多样性都是相同的。

快速小提琴:http://jsfiddle.net/yqQv7/

3 个答案:

答案 0 :(得分:4)

+new Date()Number(new Date())相同。它只是使用类型转换转换为数字。

答案 1 :(得分:1)

以下是关于standard+(加法运算符)的重要通知:

  

在ToPrimitive [类型强制对象]的调用中没有提供提示。除Date对象之外的所有本机ECMAScript对象都处理缺少提示,就像提供了提示号一样; 日期对象处理没有提示,就像提供了提示字符串一样。

当您尝试评估new Date() + 5表达式时会发生这种情况。左操作数应该变为 String ,而不是数字 - 而toString被调用,而不是valueOf

相反,这......

+new Date() + 5

...显式地将左操作数的类型设置为Number(通过调用valueOf方法,在Date的情况下返回毫秒的值)。这是在评估二进制加运算之前完成的,因为一元加优先级更高。


作为旁注,+操作中操作数的顺序在JS中无关紧要:t + 55 + t是等价的。如果t是一个字符串(或类型强制转换为字符串),+将被视为连接运算符,而不是加法运算符。

答案 2 :(得分:1)

一元' +' operator(+ x)​​只是将表达式转换为数字的一种方法。所有其他组合都是隐式数字或字符串转换。 ' +'没有特别的重载。日期的运营商。

关于Javascript运算符的完整参考的最接近的是ECMAScript标准:

http://www.ecma-international.org/publications/standards/Ecma-262.htm

对于不太复杂的概述,您可能希望查看Mozilla参考:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference#Operators