2012-03-06 38 views
40

new Date() lấy một thứ tự và trả về đối tượng Date.
Date() làm gì và làm thế nào đến thời điểm khác?Ngày so với ngày mới trong JavaScript

>>> new Date(1329429600000) 
Date {Fri Feb 17 2012 00:00:00 GMT+0200 (القدس Standard Time)} 
>>> Date(1329429600000) 
"Tue Mar 06 2012 15:29:58 GMT+0200 (Jerusalem Standard Time)" 

Trả lời

86

Từ specs:

Khi Date được gọi là một chức năng chứ không phải là một nhà xây dựng, nó sẽ trả về một String đại diện cho thời điểm hiện tại (UTC).

và:

Khi Date được gọi như là một phần của một biểu thức new, nó là một constructor: nó initialises đối tượng mới được tạo ra.

Vì vậy, new Date(...) trả về một đối tượng mà obj instanceof Date là đúng, trong khi Date(...) cơ bản trả về giống như new Date().toString().

+0

Câu trả lời hay nhất cho đến nay –

+1

bất kỳ mã giả nào về cách hàm Date() được triển khai sao cho nó có thể hoạt động như một hàm tạo và một hàm bình thường? thanks – Benny

+2

@Benny quan sát những điều sau đây: 'hàm Test() { var private =" private value "; this.public = "giá trị công khai"; trả lại "giá trị trả lại"; } ' Gọi' new Test() 'tạo một đối tượng có giá trị riêng tư và công khai. Việc gọi 'Test()' trả về một chuỗi. – musicin3d

18

new Date tạo ra một ngày đối tượng mới mà bạn có thể sửa đổi hoặc khởi tạo với một ngày khác nhau trong khi Date trả về một chuỗi ngày hiện tại/lần, bỏ qua đối số của nó.

+3

Thực ra nó trả về một chuỗi, không phải là đối tượng Date, nhưng điều này là đúng: nó hoạt động theo cách đó bởi vì nó hoạt động theo cách đó :-) – Pointy

+0

Cảm ơn, đã thay đổi câu trả lời của tôi. – xato

2

new Date() trả về ngày dựa trên thông số đầu vào và Date() trả về ngày trong ngày trên trình duyệt.

2

Ngày cho phép bạn tạo các đối tượng đại diện cho ngày/giờ. Nó KHÔNG có nghĩa là được gọi là một hàm. Bạn có thể lấy thêm thông tin tại đây: Date - MDN

5

Kiểm tra JavaScript Date để có tham chiếu API nhanh và mã kiểm tra mã. Bạn có thể thấy hàm Date() được gọi là không có new không nhận bất kỳ tham số nào và luôn trả về biểu thị string của ngày/giờ hiện tại. Nếu bạn sửa đổi mẫu là:

console.log(Date()); 
console.log(Date(1329429600000)); 

Bạn sẽ tìm thấy kết quả cho cả hai đều giống nhau (vì JavaScript bỏ qua đối số thêm thông qua chức năng):

Wed Apr 11 2012 09:58:11 GMT-0700 (PDT) 
Wed Apr 11 2012 09:58:11 GMT-0700 (PDT) 
0

Gọi một constructor như một chức năng là đồng bằng sai nó sẽ làm (có lẽ) những điều bất ngờ với phạm vi ứng dụng của bạn và trước khi rất dài bạn sẽ là trọng tâm của sự chú ý trong một phiên sửa lỗi nhóm.

Tạo đối tượng ngày theo ý định của nhà thiết kế spec, không viết mã cho các giải pháp được thực hiện như các biện pháp bảo vệ bởi các kỹ sư nghĩ rằng các lập trình viên JS là ngu ngốc. (làm việc trong phòng thí nghiệm, ngồi ở ghế tiếp theo trong cuộc trò chuyện, xử lý và tiếp tục)

Nếu bạn điên cuồng chống lại bạn mới có thể thử object.create nhưng tại thời điểm viết chậm hơn và trừ khi bạn đang lên kế hoạch để thực hiện thừa kế đa hình thì đó là nỗ lực bổ sung cho phần thưởng ít hơn.

1

Date lớp có thể được gọi là constructor hoặc như phương pháp có một built-in mã như:

function Date(args){ 
    if (this.constructor == Date){ 
     // if you call : new Date(args) 
    }else{ 
     // if you call as method : Date() 
     return new Date() 
    } 

} 

Vì vậy, nếu bạn gọi nó như phương pháp, nó lại gọi các nhà xây dựng để trả lại ngày hiện tại & thời gian.

+1

Thú vị, nhưng lưu ý rằng 'typeof Date() === 'string'', không phải'' object''. –

0

Đó là năm 2017 và tôi có cùng một câu hỏi. Tôi đã tìm thấy câu trả lời sau khi đọc:

"Cách đơn giản nhất để thực hiện chuyển đổi loại rõ ràng là sử dụng các hàm Boolean(), Number(), String() hoặc Object(). Tuy nhiên, khi được gọi mà không có toán tử trình bao mới, chúng hoạt động như các hàm chuyển đổi và thực hiện các chuyển đổi kiểu. "

" Các lớp JavaScript cố định được xây dựng sẵn toString() chuyển đổi, ngoại trừ lớp Date, thực hiện chuyển đổi toString(). "

Vì vậy ngày() được gọi mà không có từ khóa mới thực hiện chuyển đổi loại. Và vì Date là một đối tượng và một đối tượng-to-primitive nên xảy ra, các đối tượng date theo mặc định gọi toString() (mặc dù Date cũng có phương thức valueOf() có ý nghĩa).

Tìm thấy rằng trên sách "JavaScript: The Definitive Guide". Để nó ở đây cho các thế hệ tương lai mới bắt đầu học JS :)