MDN states rằng có hai nhà khai thác trong javscript rằng chia sẻ những ưu tiên cao nhất:Tại sao "new Date(). ToString()" làm việc cho ưu tiên toán tử Javascript?
- Thành viên trái kết hợp điều hành:
foo.bar
- Quyền-kết hợp điều hành mới:
new Foo()
Tôi thường một cách rõ ràng tách hai: (new Date()).toString()
Nhưng tôi thường thấy cả hai kết hợp được kết hợp: new Date().toString()
Theo this answer, lý do cách thứ hai hoạt động là đó là sự kết hợp của toán tử thứ hai quan trọng khi cả hai toán tử có quyền ưu tiên bằng nhau. Trong trường hợp này, toán tử thành viên là liên kết trái nghĩa là new Date()
được đánh giá trước tiên.
Tuy nhiên, nếu đúng như vậy, thì tại sao new Date.toString()
không thành công? Sau cùng, new Date
là just syntactic sugar cho new Date()
. Các đối số trên nói rằng nó sẽ làm việc, nhưng rõ ràng là không.
Tôi đang thiếu gì?
Bởi vì đường cú pháp không mở rộng đến instantiation VÀ truy cập thành viên. Nó phụ thuộc vào trình biên dịch. Kịch bản tương tự: VB.NET có 'Dim x As New ...' nhưng tôi không tin rằng chúng ta có thể làm 'Dim x As New Date(). ToString()'. Chúng ta có thể làm 'Dim x As String = new Date(). ToString()'. – ps2goat
Toán tử '()' sẽ thực hiện hàm tạo trước khi '.' truy cập các thuộc tính của nó. – Broxzier
@ ps2goat Bạn nói đúng, nhưng dựa trên câu trả lời dưới đây là do ngữ pháp được chỉ định chứ không phải là trình biên dịch hay thay đổi. –