Я видел это в нескольких места
function fn() {
return +new Date;
}
И я вижу, что он возвращает метку времени, а не объект даты, но я не могу найти никакой документации о том, что делает знак плюса.
Кто-нибудь может объяснить?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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" ложь
Он делает то же самое, что и:
function(){ return 0+new Date; }
который имеет тот же результат, что и:
function(){ return new Date().getTime(); }
Нету 0 + новая дата. Сначала дата преобразуется в строку, а затем добавляется «0» (например: «0Tue Oct 21 2008 20:38:05 GMT-0400»);
1 * новая дата будет, но 1 + новая дата -> строка
да, то же самое и с new Date/1
это унарный оператор +, он эквивалентен:
function(){ return Number(new Date); }
видеть: http://xkr.us/articles/javascript/unary-add/
Хороший материал - «Значения типа Date будут преобразованы в соответствующие им числовые значения (через valueOf ()), которые являются количеством миллисекунд с эпохи UNIX».
Но почему бы вам не использовать определенный метод getTime для объекта даты ?!
@tkone Кому-то нравится потому что он короче.
Практически ни при каких обстоятельствах вы не должны его использовать. Я просто обгорел на этом. + new Date () в дополнение к любым математическим операциям подвергнется серьезному снижению производительности. Посмотрите на этот jsperf, jsperf.com/new-date-timing
@BradKoch в программировании краткость, безусловно, не остроумие души. Как справедливо выразилось сообщество Python, «явное всегда лучше, чем неявное». Что, если браузер изменил предполагаемое автоматическое преобразование типов посредством регрессии? Теперь ваш код просто не работает! .getTime() всегда застрахует это.
@Geu - еще одна отличная причина, по которой то, что вы можете, не означает, что вы должны это делать!
Sine ECMAScript 5 есть Date.now(), который является предпочтительным способом получения даты и времени в миллисекундах.
Другой трюк - это var x = ~~y, который преобразуется в целое число, даже если y является значением с плавающей запятой.
На всякий случай: +new Date() полностью эквивалентен Date.now() - да?
@YuvalA. Да, он полностью эквивалентен, кроме того, что он значительно быстрее всех других методов: jsperf.com/get-unix-time-all-versions/1
Интересный факт: Gmail использует "+ new Date". Они даже не ставят скобок после этого.
Вот Спецификация относительно оператора «унарного сложения». Надеюсь, это поможет...
Дата в 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());'
Это оператор унарное добавление, который также используется для явного преобразования чисел, поэтому, когда вы вызываете +new Date(), он пытается получить числовое значение этого объекта с помощью valueOf(), как мы получаем строку из toString().
new Date().valueOf() == (+new Date) // true
Просто чтобы дать дополнительную информацию:
Если вы помните, когда вы хотите найти разницу во времени между двумя датами, вы просто делаете следующее:
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"
Возможный дубликат Для чего нужен знак плюса перед переменной?