2013-07-21 34 views
26

Tại sao trong node.js là {} == {} tương đương với false, nhưng là {} + {} == {} + {} tương đương với true?Tại sao {} == {} là sai, nhưng {} + {} == {} + {} là đúng

> {} == {} 
false 
> {} + {} == {} + {} 
true 
+17

liên quan:. [WAT?] (Http://destroyallsoftware.com/talks/wat) –

+2

Trong Chrome đó là sai sự thật, chỉ ra quan tâm. –

+1

@RichBradshaw không thử nghiệm với Chrome, chỉ với nút. – 0xAX

Trả lời

53

+ ở đây là các nhà điều hành chuỗi nối. Đây:

{} == {} 

có nghĩa là "nếu tôi có thể tạo một đối tượng với {}, và một đối tượng với {}, là họ cùng một đối tượng?"; Và câu trả lời là không".

này:

{} + {} == {} + {} 

phương tiện "là chuỗi nguyên thủy "[object Object][object Object]" giống như các chuỗi nguyên thủy "[object Object][object Object]"?"; Và câu trả lời là có".


Edited thêm: Một số bình luận chỉ ra rằng trong Web Console Chrome, {} + {} thực hiện Ngoài số, NaN + NaN, chẳng hạn rằng {} + {} == {} + {} thực sự trả false (vì nó không phải là sự thật rằng NaN == NaN). Bảng điều khiển Web của Firefox cung cấp kết quả tương tự như Chrome, nhưng nếu bạn chạy điều này bên trong một trang, nó sẽ mang lại kết quả tương tự như node.js.

[Redacted: giải thích dài về cách spec dictates rằng {} + {}nên được nối chuỗi và {} + {} == {} + {}nên là đúng; giải thích, trong khi đúng, không còn khủng khiếp thú vị, được đưa ra dưới đây]


Edited thêm:. Nhờ một lời nhận xét của jJ', bây giờ tôi có thể cung cấp một lời giải thích rõ hơn về sự mâu thuẫn.

Lý do cho hành vi của Bảng điều khiển Web là Bảng điều khiển Web không yêu cầu cụ thể biểu thức; nó sẽ vui vẻ chấp nhận một cái gì đó như if(true) { }. Vì vậy, khi nó nhìn thấy {} + {}, nó không giải thích rằng đó là một biểu thức; {} ban đầu được hiểu là khối khỏa thân, sau đó + {} được hiểu là biểu thức (tạo đối tượng mới, chuyển đổi thành số nguyên — cụ thể là NaN — và đánh giá số đó). Bảng điều khiển Web hiển thị kết quả của biểu thức cuối cùng (ví dụ: đầu vào 3; 4 sẽ cung cấp đầu ra 4), trong trường hợp này là NaN.

{} + {} == {} + {}, tương tự, được hiểu như là "khối trống rỗng, tiếp theo là (+{}) == ({} + {})", tức là, "trống rỗng khối, tiếp theo là NaN == '[object Object][object Object]'", tức là "khối trống rỗng, tiếp theo là false".

Điều này có thể được sửa bằng cách sử dụng dấu ngoặc đơn; Ví dụ: ({} + {} == {} + {}) trả về true.

(Hành vi này, bằng cách này, không hoàn toàn cụ thể đối với Bảng điều khiển Web.eval theo quy tắc tương tự, chẳng hạn rằng eval('{} + {}')NaNeval('({} + {})')'[object Object][object Object]')

+0

Vâng, tôi đã thấy "[đối tượng Object] [đối tượng]" kết quả từ {} + {}, tôi mới trong node.js và không chú ý rằng nó chỉ là một chuỗi, tôi nghĩ rằng đó là kiểu dữ liệu nội bộ của nút :), bây giờ tôi thấy rằng 'typeof ({} + {})' là 'chuỗi'. Cảm ơn bạn đã trả lời và giải thích tuyệt vời – 0xAX

+0

@ruakh: Giải thích tuyệt vời! Bất kỳ suy nghĩ nào về lý do tại sao '{} + {} == {} + {}' trả về 'false' trong chrome và firefox? –

+2

@ go-oleg Vì trong FF '{} + {}' là 'NaN'. Và 'NaN == NaN' là sai, vì ** NaN không bao giờ bằng chính **. Xem giải thích này: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FNaN – BlackSheep

Các vấn đề liên quan