Có sự khác biệt giữa hai:
new Date().toString()
công trình hoàn hảo và trả về ngày hiện tại
new Date.toString()
ném "Lỗi Loại: Date.toString không phải là một constructor"
Điều này xảy ra vì new Date()
và new Date
ha đã ưu tiên khác nhau.Theo MDN phần của JavaScript bảng điều hành ưu tiên chúng tôi quan tâm đến vẻ bề ngoài như:
╔════════════╦═════════════════════════════╦═══════════════╦═════════════╗
║ Precedence ║ Operator type ║ Associativity ║ Operators ║
╠════════════╬═════════════════════════════╬═══════════════╬═════════════╣
║ 18 ║ Member Access ║ left-to-right ║ … . … ║
║ ║ Computed Member Access ║ left-to-right ║ … [ … ] ║
║ ║ new (with argument list) ║ n/a ║ new … (…) ║
╠════════════╬═════════════════════════════╬═══════════════╬═════════════╣
║ 17 ║ Function Call ║ left-to-right ║ … (…) ║
║ ║ new (without argument list) ║ right-to-left ║ new … ║
╚════════════╩═════════════════════════════╩═══════════════╩═════════════╝
Từ bảng này sau đó:
new Foo()
có độ ưu tiên cao hơn sau đó new Foo
new Foo()
có cùng một ưu tiên như .
nhà điều hành
new Foo
có độ ưu tiên một cấp thấp hơn thì .
hành
new Date().toString()
công trình một cách hoàn hảo bởi vì nó đánh giá như (new Date()).toString()
new Date.toString()
ném "Lỗi Loại: Date.toString không phải là một constructor" vì .
có độ ưu tiên cao hơn sau đó new Date
(và cao hơn thì "Gọi hàm") và biểu thức đánh giá là (new (Date.toString))()
Logic tương tự có thể được áp dụng cho toán tử … [ … ]
.
new Foo
có từ phải sang trái kết hợp và cho new Foo()
"liên kết" không áp dụng được. Tôi nghĩ trong thực tế nó không tạo ra bất kỳ sự khác biệt nào. Để biết thêm thông tin, xem this SO câu hỏi
Is one preferred over the other?
Biết tất cả những gì nó có thể được giả định rằng new Foo()
được ưa thích.
http://www.ecma-international.org/ecma-262/5.1/#sec-11.2.2 – SheetJS
Tham chiếu cập nhật: ECMAScript 2017 [* §12.3.3 Toán tử mới *] (http: // ecma -international.org/ecma-262/8.0/#sec-new-operator). – RobG