Câu hỏi Sự khác biệt giữa == và === trong JavaScript [trùng lặp]


Có thể trùng lặp:
Javascript === vs ==: Liệu nó có vấn đề toán tử "bằng" nào tôi sử dụng? 

Sự khác biệt giữa == và === trong JavaScript? Tôi cũng đã thấy != và !== toán tử. Có nhiều nhà khai thác như vậy không?


1415
2018-02-07 11:53


gốc


Dưới đây là so sánh chi tiết của cả hai toán tử trong JavaScript với kiểm tra hiệu suất - Zaheer Ahmed
== Là === với loại chuyển đổi (aka coercion). Để thực sự hiểu ý tôi, bạn có thể xem hàm JavaScript này hoạt động chính xác như ==: stackoverflow.com/a/38856418/984780 - Luis Perez
Ngoài === và! == trong JS, chúng cũng nên thêm + == và - == để tăng hoặc giảm chỉ khi cùng loại. - eoredson


Các câu trả lời:


=== và !== là các toán tử so sánh nghiêm ngặt:

JavaScript có cả nghiêm ngặt và   loại so sánh bình đẳng chuyển đổi.   Đối với sự bình đẳng nghiêm ngặt, các vật thể   so sánh phải có cùng loại và:

  • Hai chuỗi hoàn toàn bình đẳng khi chúng có cùng chuỗi   các ký tự, cùng độ dài và giống nhau   ký tự ở các vị trí tương ứng.
  • Hai con số hoàn toàn bình đẳng khi chúng bằng nhau về số lượng (có   cùng một giá trị số). NaN không   bằng bất kỳ thứ gì, kể cả NaN.   Số 0 dương và âm bằng nhau   với nhau.
  • Hai toán hạng Boolean hoàn toàn bình đẳng nếu cả hai đều đúng hoặc   cả hai đều sai.
  • Hai đối tượng hoàn toàn bình đẳng nếu chúng đề cập đến cùng một đối tượng.
  • Các kiểu Null và Undefined là == (nhưng không phải ===). [I E. (Null == Undefined) là đúng nhưng (Null === Undefined) là sai]

Toán tử so sánh - MDC


1077
2018-02-07 11:55



Vì vậy, nếu tôi làm ví dụ: if (input == null) ..., nó cũng sẽ làm cho điều kiện đúng khi đầu vào là không xác định? - Filip Vondrášek
Ở trên làm cho nó âm thanh như thể một so sánh == sẽ không kiểm tra tất cả mọi thứ trong điểm bullet đầu tiên, "cùng một chuỗi ký tự, cùng độ dài, và các ký tự tương tự ở vị trí tương ứng" nhưng trên thực tế nó có. Theo như tôi có thể nói sự khác biệt thực sự duy nhất khi so sánh hai chuỗi là với ===, new String()===new String() trả về false (các tham chiếu đối tượng khác nhau). Nhưng new String nên tránh anyway. - Matt Browne
-1 Câu hỏi là "sự khác biệt là gì?" và bạn chỉ giải thích các nhà khai thác nghiêm ngặt, nhưng không phải là sự khác biệt giữa họ và những người không nghiêm ngặt - CodyBugstein
Tôi đã không chính xác nhận được "Hai vật thể hoàn toàn bình đẳng nếu chúng đề cập đến cùng một vật thể" - gì? bởi hai đối tượng, có nghĩa là hai biến tham chiếu ..? - T J
Để biết mô tả bằng tiếng Anh đơn giản về vấn đề, hãy xem stackoverflow.com/a/38856418/984780 - Luis Perez


Hãy xem ở đây: http://longgoldenears.blogspot.com/2007/09/triple-equals-in-javascript.html

3 dấu bằng có nghĩa là "bình đẳng không bị ép buộc loại". Sử dụng ba bằng, các giá trị phải bằng nhau trong loại là tốt.

0 == false   // true
0 === false  // false, because they are of a different type
1 == "1"     // true, automatic type conversion for value only
1 === "1"    // false, because they are of a different type
null == undefined // true
null === undefined // false
'0' == false // true
'0' === false // false

1761
2018-02-07 11:57



Cảm ơn câu trả lời rõ ràng! Tôi đoán nếu so sánh với C # == cũng sẽ là == và === sẽ dịch sang .Equals () - Koen Zomers
Còn về "new String () === new String ()", cả hai giá trị và các loại đều giống nhau. Nhưng câu trả về sai. - riship89
@ hrishikeshp19: trong trường hợp đó, các giá trị thực sự khác nhau (tham chiếu đối tượng khác nhau) - l8nite
@ KoenZomers Tôi không nghĩ rằng trường hợp C # của bạn là đúng. Trên thực tế không có tương đương trong C #. == trong C # thực hiện so sánh tham chiếu, và Equals làm so sánh được xác định trước, không ai trong số chúng có tương đương trong JavaScript. - Earth Engine
@ hrishikeshp19, new String() không thuộc loại chuỗi, nó thuộc loại đối tượng, vì vậy quy tắc === cho các đối tượng được áp dụng. Tuy nhiên, việc sử dụng các chuỗi nguyên thủy thường dẫn đến việc xâu chuỗi các chuỗi thành String đối tượng, do đó, sự khác biệt là tinh tế. Nếu bạn được chỉ định new String() với hai vật thể khác nhau, s1 và s2, các valueOf() phương pháp trên mỗi sẽ trả về một chuỗi nguyên thủy cho mỗi, và s1.valueOf() === s2.valueOf() sẽ trở lại true. - danorton