Nếu bạn mở giao diện điều khiển JS và nhập [] + {} === {} + []
nó sẽ cho bạn biết đó là sự thật.Tại sao [] + {} === {} + [] đúng?
Tôi không hiểu tại sao lại như vậy. Tôi đã cố gắng tìm hiểu cách phân tích cú pháp.
Đối với [] + {}
, đây là toán tử bổ sung làm toán hạng là cả hai chữ. LHS không mang lại một số thông qua .valueOf()
để nó thực hiện nối chuỗi sử dụng .toString()
trên cả hai toán hạng cho chúng tôi ""
+ "[object Object]"
Đối {} + []
các {}
là một khối mã rỗng và được 'bỏ qua', các nhà điều hành +
đây được phân tích như toán tử cộng đơn, nó chuyển đổi toán hạng thành Số. Các mảng trống được chuyển đổi thành một số trở thành 0
Vì vậy, đây có vẻ là "[object Object]" === 0
mà chắc chắn phải là sai ?.
Toán tử danh tính sẽ kiểm tra xem hai toán hạng có bằng nhau không có chuyển đổi loại hay không. Tôi không thể thấy điều này bao giờ là sự thật. Tôi đang thiếu một phần câu chuyện nào?
Edit:
tôi thấy nếu bạn gõ ({} + [])
nó phân tích nó như là một đối tượng có sản phẩm nào làm cho RHS bằng "[đối tượng Object]". Tôi nhìn nó lên và ()
là toán tử nhóm. Vì vậy, có lẽ điều này có cái gì để làm với điều này?
Đây không phải là bản sao của What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wat' talk for CodeMash 2012?. Trả lời các điểm bullet 1 === 2 KHÔNG nên đúng.
http://stackoverflow.com/questions/9032856/what-is-the-explanation-for-these-bizarre-javascript-behaviours-mentioned-in-the Và http://stackoverflow.com/questions/36438034/Tại sao-là-không-nan-in-chrome-giao diện điều khiển – epascarello
Rỗng đối tượng tham số trả về một constructor đối tượng cũng == 'true' và một mảng trống cũng là một đối tượng constructor trả về true – Dennisrec
' {} 'không thể có thể được hiểu là một khối trống, vì nó xuất hiện ngay sau khi '===' (và '[] + {} ===' không phải là một câu lệnh hợp lệ trong chính nó). – Frxstrem