加号运算符('+')似乎在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对象有什么影响?这样我就可以确信在每个浏览器中+的行为的多样性都是相同的。
答案 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 + 5
和5 + 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