Dấu cộng làm gì trong '+ ngày mới'


238

Tôi đã thấy điều này ở một vài nơi

function fn() {
    return +new Date;
}

Và tôi có thể thấy rằng nó đang trả về dấu thời gian chứ không phải là một đối tượng ngày, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về những gì dấu cộng đang làm.

Bất cứ ai có thể giải thích?


Câu trả lời:


294

đó là toán tử + unary, nó tương đương với:

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

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

và trong MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithatures_Operators#Unary_plus


4
Nhưng giống như tại sao bạn không sử dụng getTimephương thức được xác định trên đối tượng ngày?!
tkone

30
Trong hầu như không có trường hợp nào bạn thực sự nên sử dụng này. Tôi thực sự bị cháy về điều này. + Ngày mới () ngoài bất kỳ loại hoạt động toán học nào sẽ phải chịu một hình phạt hiệu suất lớn. Nhìn vào jsperf này, jsperf.com/new-date-timing
Geuis

9
@BradKoch trong lập trình ngắn gọn chắc chắn không phải là trí thông minh của tâm hồn. Vì cộng đồng python đã đặt nó một cách đầy đủ nên "rõ ràng luôn tốt hơn là ngầm". Điều gì xảy ra nếu một trình duyệt thay đổi chuyển đổi loại tự động ngụ ý ở đó thông qua hồi quy? Bây giờ mã của bạn không hoạt động! .getTime()sẽ luôn luôn đảm bảo nó làm.
tkone

11
@Geuis một lý do tuyệt vời khác chỉ vì bạn không thể có nghĩa là bạn nên!
tkone

14
Sine ECMAScript 5 có Date.now(), đó là cách ưa thích để có được ngày và thời gian tính bằng mili giây.
cutemachine


6

Một ngày JavaScript có thể được viết dưới dạng một chuỗi:

Ngày 10 tháng 9 năm 2015 12:02:54 GMT + 0530 (IST)

hoặc như một số:

1441866774938

Ngày được viết dưới dạng số, chỉ định số mili giây kể từ ngày 1 tháng 1 năm 1970, 00:00:00.

Đến với câu hỏi của bạn, nó xử lý bằng cách thêm '+' sau toán tử gán '=', chuyển đổi Ngày thành giá trị số bằng nhau.

tương tự có thể đạt được bằng cách sử dụng hàm Number (), như Number (ngày mới ());

var date = +new Date(); //same as 'var date =number(new Date());'


3

Chỉ để cung cấp thêm một số thông tin:

Nếu bạn nhớ, Khi bạn muốn tìm chênh lệch thời gian giữa hai Ngày, bạn chỉ cần làm như sau;

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"

Bây giờ nếu bạn kiểm tra loại d1-0, thì đó cũng là một số:

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

+ cũng sẽ chuyển đổi Ngày thành Số:

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

Nhưng lưu ý rằng 0 + new Date()sẽ không được đối xử tương tự! nó sẽ được nối thành chuỗi:

0 + new Date() // "0Tue Oct 16 05:03:24 PDT 2018"

1

Nó là một toán tử add unary và cũng được sử dụng để chuyển đổi Số rõ ràng, vì vậy khi bạn gọi +new Date(), nó cố gắng lấy giá trị số của đối tượng đó bằng cách sử dụng valueOf()như chúng tôi nhận được chuỗi từtoString()

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

-3

Nó thực hiện chính xác như:

hàm () {return 0 + Ngày mới; }

có kết quả tương tự như:

function () {trả về Ngày mới (). getTime (); }

11
Không vào ngày 0 + ngày mới. Đầu tiên đó chuyển đổi ngày thành một chuỗi và sau đó trả trước "0", (ví dụ: "0Tue ngày 21 tháng 10 năm 2008 20:38:05 GMT-0400");
Chris Noe

2
1 * Ngày mới sẽ, nhưng 1 + Ngày mới -> Chuỗi
Kent Fredric

ya, cũng vậy vớinew Date/1
Ashish
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.