Что делает знак плюс в «+ новой дате»

238

Я видел это в нескольких местах

function fn() {
    return +new Date;
}

И я вижу, что он возвращает метку времени, а не объект даты, но я не могу найти никакой документации о том, что делает знак плюс.

Кто-нибудь может объяснить?

кругозор
источник
Возможный дубликат Какова цель символа плюс перед переменной?
Дональд Дак

Ответы:

294

это унарный оператор +, это эквивалентно:

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

см .: http://xkr.us/articles/javascript/unary-add/

и в MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Unary_plus

kentaromiura
источник
4
Но почему бы вам не использовать определенный getTimeметод для объекта date ?!
tkone
30
Практически ни при каких обстоятельствах вы не должны использовать это. Я просто сгорел от этого. + новый Date () в дополнение к любым математическим операциям подвергнется серьезному снижению производительности. Посмотрите на этот jsperf, jsperf.com/new-date-timing
Geuis
9
@BradKoch в программировании краткость, безусловно, не остроумие души. Как правильно выразилось сообщество Python, «явное всегда лучше, чем неявное». Что если браузер изменил автоматическое преобразование типов, подразумеваемое регрессией? Теперь ваш код просто не работает! .getTime()всегда буду гарантировать
tkone
11
@Geuis еще одна отличная причина, что просто потому, что вы можете, не значит, что вы должны!
tkone
14
Синус ECMAScript 5 есть Date.now(), который является предпочтительным способом получения даты и времени в миллисекундах.
cutemachine
43

JavaScript является свободно типизированным, поэтому он выполняет приведение / преобразование типов в определенных обстоятельствах:

http://blog.jeremymartin.name/2008/03/understanding-loose-typing-in.html
http://www.jibbering.com/faq/faq_notes/type_convert.html

Другие примеры:

>>> +new Date()
1224589625406
>>> +"3"
3
>>> +true
1
>>> 3 == "3"
true
Джонни Бьюкенен
источник
>>> 3 === "3" ложь
Дэвид Спектор
6

Дата JavaScript может быть записана в виде строки:

Чт 10 сентября 2015 12:02:54 GMT + 0530 (IST)

или как число:

1441866774938

Даты, записанные в виде чисел, указывают количество миллисекунд с 1 января 1970 года, 00:00:00.

Возвращаясь к вашему вопросу, он добавляет, что, добавив «+» после оператора присваивания «=», конвертирует дату в равное числовое значение.

того же можно достичь с помощью функции Number (), например Number (new Date ());

var date = +new Date(); //same as 'var date =number(new Date());'
Dev
источник
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"
S.Serpooshan
источник
1

Это унарный оператор сложения, который также используется для явного преобразования чисел, поэтому при вызове +new Date()он пытается получить числовое значение этого объекта, используя, valueOf()как мы получаем строку изtoString()

new Date().valueOf() == (+new Date)  // true
Raghavendra
источник
-3

Он делает то же самое, что и:

function () {return 0 + new Date; }

это имеет тот же результат, что и:

function () {return new Date (). getTime (); }
Сергей Ильинский
источник
11
Нет на 0 + новая дата. Это сначала преобразует дату в строку, а затем добавляет «0» (например: «0Tue 21.10.2008 20:38:05 GMT-0400»);
Крис Ноу
2
1 * новая дата будет, но 1 + новая дата -> String
Кент Фредрик
да, то же самое касаетсяnew Date/1
Ашиш