Що робить знак плюс у "+ нова дата"


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метод на об’єкті дати ?!
tkone

30
За майже жодних обставин ви не повинні цим користуватися. Я просто дійсно згорів на цьому. + нова дата () на додаток до будь-яких математичних операцій зазнає значного штрафу за продуктивність. Подивіться на цей jsperf, jsperf.com/new-date-timing
Geuis

9
@BradKoch в програмуванні стислості - це, звичайно, не дотепність душі. Як адекватно сказала спільнота python, "явне завжди краще, ніж неявне". Що робити, якщо браузер змінив автоматичне перетворення типів, яке мається на увазі через регресію? Тепер ваш код просто не працює! .getTime()завжди буде страхувати це.
tkone

11
@Geuis ще одна відмінна причина, що просто тому, що ти не можеш означати, що ти повинен!
tkone

14
Sine ECMAScript 5 є Date.now(), що є кращим способом отримання дати та часу в мілісекундах.
cutemachine


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 + нова дата; }

що має такий же результат, як:

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

11
Ні на 0 + нову дату. Це спочатку перетворює дату в рядок, а потім робить попередній "0", (наприклад: "0Тур, 21 жовтня 2008 20:38:05 GMT-0400");
Кріс Ное

2
1 * нова дата буде, але 1 + нова дата -> Рядок
Кент Фредрік

Так, те саме стосується іnew Date/1
Ашиш,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.