Co robi znak plus w „+ nowa data”

238

Widziałem to w kilku miejscach

function fn() {
    return +new Date;
}

Widzę, że zwraca znacznik czasu, a nie obiekt daty, ale nie mogę znaleźć żadnej dokumentacji na temat tego, co robi znak plus.

Czy ktoś może wyjaśnić?

Rozpoznać
źródło
Możliwy duplikat Jaki jest cel znaku plus przed zmienną?
Kaczor Donald

Odpowiedzi:

294

to jest operator jednoargumentowy, jest to równoważne z:

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

patrz: http://xkr.us/articles/javascript/unary-add/

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

kentaromiura
źródło
4
Ale dlaczego nie miałbyś użyć zdefiniowanej getTimemetody na obiekcie daty ?!
tkone
30
Prawie pod żadnym pozorem nie powinieneś tego używać. Właśnie się na tym poparzyłem. + nowa data () oprócz wszelkiego rodzaju operacji matematycznych zostanie poważnie zagrożona. Spójrz na to jsperf, jsperf.com/new-date-timing
Geuis
9
@BradKoch w programowaniu zwięzłości z pewnością nie jest dowcipem duszy. Jak ujęła to społeczność python, „jawne jest zawsze lepsze niż niejawne”. Co jeśli przeglądarka zmieni automatyczną konwersję typu, która jest tam sugerowana poprzez regresję? Teraz twój kod po prostu nie działa! .getTime()zawsze upewni się, że tak będzie.
tkone
11
@Geuis to kolejny doskonały powód, dla którego to, że nie możesz, nie oznacza, że ​​powinieneś!
tkone
14
Istnieje sinus ECMAScript 5 Date.now(), który jest preferowanym sposobem uzyskiwania daty i godziny w milisekundach.
cutemachine
6

Data JavaScript może być zapisana jako ciąg:

Czw 10 września 2015 12:02:54 GMT + 0530 (IST)

lub jako liczba:

1441866774938

Daty zapisane jako liczby określają liczbę milisekund od 1 stycznia 1970 r., 00:00:00.

W odpowiedzi na twoje pytanie wydaje się, że dodając „+” po operatorze przypisania „=”, konwertuje Data na wartość równą liczbie.

to samo można osiągnąć za pomocą funkcji Number (), na przykład Number (new Date ());

var date = +new Date(); //same as 'var date =number(new Date());'
Dev
źródło
6

Oto specyfikacja dotycząca operatora „unary add”. Mam nadzieję, że to pomoże...

Pablo Cabrera
źródło
3

Aby podać więcej informacji:

Jeśli pamiętasz, gdy chcesz znaleźć różnicę czasu między dwiema datami, po prostu wykonaj następujące czynności;

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"

teraz, jeśli zaznaczysz typ d1-0, jest to również liczba:

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

ten + przekształci również datę na liczbę:

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

Ale uwaga, że 0 + new Date()będzie nie być traktowane podobnie! będzie konkatenowany jako ciąg:

0 + new Date() // "0Tue Oct 16 05:03:24 PDT 2018"
S.Serpooshan
źródło
1

Jest to jednoargumentowy operator dodawania , który jest również używany do jawnej konwersji liczb, więc kiedy wywołujesz +new Date(), próbuje uzyskać wartość liczbową tego obiektu przy użyciu, valueOf()tak jak otrzymujemy ciąg ztoString()

new Date().valueOf() == (+new Date)  // true
Raghavendra
źródło
-3

Robi dokładnie to samo, co:

function () {return 0 + nowa data; }

który ma taki sam wynik jak:

function () {return new Date (). getTime (); }
Siergiej Iliński
źródło
11
Nie w dniu 0 + nowa data. To najpierw konwertuje datę na ciąg, a następnie wstawia „0”, (np .: „0Tue Oct 21 2008 20:38:05 GMT-0400”);
Chris Noe
2
1 * nowa data będzie, ale 1 + nowa data -> Ciąg
Kent Fredric
tak, to samo dotyczynew Date/1
Ashish