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


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


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());'


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

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

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

-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
Ашиш
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.