Что означает знак плюса в '+ new Date'

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

function fn() {
    return +new Date;
}

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

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

Donald Duck 09.08.2018 02:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
245
1
43 935
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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" ложь

David Spector 03.12.2018 15:54

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

function(){ return 0+new Date; }

который имеет тот же результат, что и:

function(){ return new Date().getTime(); }

Нету 0 + новая дата. Сначала дата преобразуется в строку, а затем добавляется «0» (например: «0Tue Oct 21 2008 20:38:05 GMT-0400»);

Chris Noe 22.10.2008 04:40

1 * новая дата будет, но 1 + новая дата -> строка

Kent Fredric 03.12.2008 18:56

да, то же самое и с new Date/1

Ashish 26.08.2015 12:44
Ответ принят как подходящий

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

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

Хороший материал - «Значения типа Date будут преобразованы в соответствующие им числовые значения (через valueOf ()), которые являются количеством миллисекунд с эпохи UNIX».

Kon 21.10.2008 18:53

Но почему бы вам не использовать определенный метод getTime для объекта даты ?!

tkone 24.08.2012 01:36

@tkone Кому-то нравится потому что он короче.

Brad Koch 11.10.2012 02:12

Практически ни при каких обстоятельствах вы не должны его использовать. Я просто обгорел на этом. + new Date () в дополнение к любым математическим операциям подвергнется серьезному снижению производительности. Посмотрите на этот jsperf, jsperf.com/new-date-timing

Geuis 11.10.2012 04:58

@BradKoch в программировании краткость, безусловно, не остроумие души. Как справедливо выразилось сообщество Python, «явное всегда лучше, чем неявное». Что, если браузер изменил предполагаемое автоматическое преобразование типов посредством регрессии? Теперь ваш код просто не работает! .getTime() всегда застрахует это.

tkone 11.10.2012 06:13

@Geu - еще одна отличная причина, по которой то, что вы можете, не означает, что вы должны это делать!

tkone 11.10.2012 06:13

Sine ECMAScript 5 есть Date.now(), который является предпочтительным способом получения даты и времени в миллисекундах.

cutemachine 22.02.2013 16:18

Другой трюк - это var x = ~~y, который преобразуется в целое число, даже если y является значением с плавающей запятой.

Reactgular 28.12.2016 18:22

На всякий случай: +new Date() полностью эквивалентен Date.now() - да?

Yuval A. 27.01.2018 13:55

@YuvalA. Да, он полностью эквивалентен, кроме того, что он значительно быстрее всех других методов: jsperf.com/get-unix-time-all-versions/1

MacroMan 30.07.2018 17:35

Интересный факт: Gmail использует "+ new Date". Они даже не ставят скобок после этого.

MCCCS 09.12.2018 16:01

Вот Спецификация относительно оператора «унарного сложения». Надеюсь, это поможет...

Дата в 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"

Другие вопросы по теме