加号在“ +新日期”中有什么作用


238

我在几个地方看过

function fn() {
    return +new Date;
}

而且我可以看到它返回的是时间戳而不是日期对象,但是我找不到任何有关加号的内容的文档。

谁能解释?


Answers:


294

那是+一元运算符,它等效于:

function(){ return Number(new Date); }

参见:http : //xkr.us/articles/javascript/unary-add/

并在MDN中:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Unary_plus


4
但是就像为什么不对getTimedate对象使用定义的方法?
tkone 2012年

30
几乎在任何情况下,您都不应实际使用此功能。我只是真的为此而生。除了任何数学运算以外,+ new Date()还将遭受重大性能损失。看看这个jsperf,jsperf.com / new
date-

9
简洁编程中的@BradKoch当然不是灵魂的智慧。正如python社区这么恰当地指出的那样,“显式总是比隐式更好。” 如果浏览器更改了通过回归暗示的自动类型转换,该怎么办?现在,您的代码不起作用!.getTime()会始终确保这样做。
tkone 2012年

11
@Geuis的另一个绝佳原因是,仅仅因为你做不到就意味着你应该做!
tkone 2012年

14
有Sine ECMAScript 5 Date.now(),这是获取日期和时间(以毫秒为单位)的首选方法。
cutemachine


6

JavaScript日期可以写为字符串:

2015年9月10日星期四12:02:54 GMT + 0530(IST)

或作为数字:

1441866774938

以数字表示的日期,指定自1970年1月1日00:00:00以来的毫秒数。

谈到您的问题,它是通过在赋值运算符'='之后添加'+'来实现的,从而将Date转换为相等的数字值。

使用Number()函数也可以实现相同的效果,例如Number(new Date());。

var date = +new Date(); //same as 'var date =number(new Date());'


3

只是提供一些更多信息:

如果您还记得,要查找两个日期之间的时差,只需执行以下操作;

var d1 = new Date("2000/01/01 00:00:00"); 
var d2 = new Date("2000/01/01 00:00:01");  //one second later

var t = d2 - d1; //will be 1000 (msec) = 1 sec

typeof t; // "number"

现在,如果您检查d1-0的类型,那么它也是一个数字:

t = new Date() - 0; //numeric value of Date: number of msec's since 1 Jan 1970.
typeof t; // "number"

该+还将日期转换为数字:

typeof (+new Date()) //"number"

但是请注意,0 + new Date()不会被类似地对待!它将被串联为字符串:

0 + new Date() // "0Tue Oct 16 05:03:24 PDT 2018"

1

它是一元加法运算符,还用于显式的Number转换,因此,当您调用时+new Date(),它会尝试使用来获取该对象的数值,valueOf()就像我们从toString()

new Date().valueOf() == (+new Date)  // true

-3

它与以下功能完全相同:

function(){return 0 + new Date; }

结果与:

function(){返回新的Date()。getTime(); }

11
在0+新日期之前不可以。首先将日期转换为字符串,然后加上“ 0”(例如:“ 0Tue Oct 21 2008 20:38:05 GMT-0400”);
克里斯·诺 Chris Noe)

2
1个*新日期,但1个+新日期->字符串
Kent Fredric

是的,同样如此new Date/1
Ashish
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.