Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Các toán tử so sánh (Comparison Operators) trong JavaScript

Toán tử so sánh trả về true hoặc false. JS có 2 loại: Loose Equality (==, !=) có ép kiểu, và Strict Equality (===, !==) không ép kiểu – luôn dùng strict.

Danh sách toán tử

Toán tửTênMô tảVí dụ (a=10, b=20)
==Loose EqualSo sánh giá trị SAU KHI ÉP KIỂU10 == "10" → true ⚠️
===Strict EqualSo sánh GIÁ TRỊ VÀ KIỂU (không ép kiểu)10 === "10" → false ✅
!=Loose Not EqualNgược của ==10 != "10" → false ⚠️
!==Strict Not EqualNgược của ===10 !== "10" → true ✅
>Greater ThanLớn hơn (có ép kiểu)10 > 20 → false
<Less ThanNhỏ hơn (có ép kiểu)10 < 20 → true
>=Greater or EqualLớn hơn hoặc bằng10 >= 20 → false
<=Less or EqualNhỏ hơn hoặc bằng10 <= 20 → true

Quy tắc ép kiểu của == (Abstract Equality)

  • null == undefined → true (đặc biệt).
  • Số so với chuỗi: chuỗi → số ("10" == 10 → true).
  • Boolean so với bất kỳ: boolean → số (true == 1 → true, false == 0 → true).
  • Object so với primitive: object → primitive (valueOf/toString).

// Các trường hợp "khoái" của ==
"" == 0;           // true
"" == false;       // true
0 == false;        // true
"0" == false;      // true
null == undefined; // true
null == 0;         // false!
undefined == 0;    // false!
[] == "";          // true
[] == 0;           // true
[0] == false;      // true
[1] == true;       // true
"1" == true;       // true

Tại sao TRÁNH == và !=?

  • Khó dự đoán, gây bug ngầm.
  • Không đối xứng trong một số trường hợp hiếm.
  • Làm code khó đọc, khó bảo trì.
  • ESLint rule eqeqeq khuyến nghị ===/!==.

So sánh Object


{} === {};              // false (khác tham chiếu)
const a = {}; a === a;  // true (cùng tham chiếu)

[1,2] == "1,2";         // true! (array → "1,2" → so sánh string)
[1,2] === "1,2";        // false (khác kiểu)

Object.is() (ES6) – So sánh chính xác nhất


Object.is(10, 10);        // true
Object.is(10, "10");      // false
Object.is(NaN, NaN);      // true! (=== cho false)
Object.is(0, -0);         // false! (=== cho true)
Object.is(+0, -0);        // false

Ví dụ demo từ bài gốc


<script>
  var a = 10, b = 20;
  var br = "<br />";
  
  document.write("(a == b) => " + (a == b) + br);   // false
  document.write("(a === b) => " + (a === b) + br); // false
  document.write("(a != b) => " + (a != b) + br);   // true
  document.write("(a !== b) => " + (a !== b) + br); // true
  document.write("(a < b) => " + (a < b) + br);     // true
  document.write("(a > b) => " + (a > b) + br);     // false
  document.write("(a <= b) => " + (a <= b) + br);   // true
  document.write("(a >= b) => " + (a >= b) + br);   // false
</script>

Best Practice

  1. Luôn dùng === và !== – dự đoán được, nhanh hơn (không ép kiểu).
  2. Dùng Object.is() khi cần phân biệt NaN, +0, -0.
  3. Chỉ dùng == null / != null để check null OR undefined (idiom chấp nhận được).
  4. So sánh object: dùng JSON.stringify() (shallow), lodash.isEqual() (deep), hoặc so sánh field cụ thể.