Equality (sự bằng nhau)
Trong bất kỳ ngôn ngữ nào, đều có lúc cần so sánh giá trị. Trong JavaScript, có hai toán tử so sánh bằng là toán tử bằng (==) và toán tử bằng nghiêm ngặt (===). Lý do có hai toán tử để kiểm tra bằng nhau là vì không phải lúc nào cùng một thứ cũng được coi là bằng nhau.
Bằng nhau với ===
Đúng như tên gọi "nghiêm ngặt", bằng nhau với toán tử này nghĩa là type bằng nhau VÀ giá trị bằng nhau. Hành vi này giống với == trong các ngôn ngữ chỉ có một toán tử so sánh bằng.
Ví dụ sau có thể bạn thấy là đương nhiên.
js// JavaScriptconsole .log (null ===undefined );console .log (0 === 0n);console .log (0 === "0");
js// JavaScriptconsole .log (null ===undefined );console .log (0 === 0n);console .log (0 === "0");
0n là kiểu bigint chứ không phải kiểu number.
📄️ Kiểu bigint
Kiểu bigint trong JavaScript là primitive type có thể xử lý số nguyên lớn hơn kiểu number.
Bằng nhau với ==
Dù chỉ là toán tử bằng thông thường, nhưng toán tử này có thể coi là bằng nhau ngay cả khi type khác nhau. Chính xác hơn, khi type của giá trị khác nhau, nó sẽ thử convert type rồi mới so sánh giá trị.
tsconsole .log (null ==undefined );console .log (0 == 0n);console .log (0 == "0");console .log (0 == "");console .log (0 == false);console .log ("0" == false);console .log ("" == false);
tsconsole .log (null ==undefined );console .log (0 == 0n);console .log (0 == "0");console .log (0 == "");console .log (0 == false);console .log ("0" == false);console .log ("" == false);
"0" == false và "" == false đều trả về true, nhưng cần lưu ý rằng "" == "0" lại là false.
Khi nào dùng == và ===, hay phân biệt sử dụng
Từ quan điểm tránh hành vi không mong muốn, nên thường xuyên dùng toán tử bằng nghiêm ngặt (===), và dùng toán tử bằng (==) khi cần thiết. Tuy nhiên, hầu hết "khi cần thiết" đó là x == null. Điều này trả về true khi biến x là null hoặc undefined.
Các giá trị cần cẩn thận khi so sánh bằng
Có những giá trị nếu so sánh bằng không cẩn thận sẽ trả về false và cần chú ý.
NaN- Giá trị kiểu symbol
- Giá trị kiểu object
NaN
NaN là giá trị kiểu number, nhưng khi so sánh với bất kỳ giá trị nào đều trả về false. Ngay cả khi so sánh NaN với NaN cũng trả về false.
js// JavaScriptconsole .log (NaN ==NaN );console .log (NaN ===NaN );
js// JavaScriptconsole .log (NaN ==NaN );console .log (NaN ===NaN );
Sử dụng tính chất này, có thể kiểm tra xem giá trị có phải NaN không.
tsfunctionisNaN (value : unknown): boolean {returnvalue !==value ;}console .log (isNaN (1));console .log (isNaN (NaN ));
tsfunctionisNaN (value : unknown): boolean {returnvalue !==value ;}console .log (isNaN (1));console .log (isNaN (NaN ));
Giá trị kiểu symbol
Kiểu symbol, dù so sánh các giá trị có cùng description (tham số đầu tiên), nếu không tham chiếu đến cùng một biến thì sẽ trả về false.
tsconsole .log (Symbol ("piano") ==Symbol ("piano"));console .log (Symbol ("piano") ===Symbol ("piano"));constsym =Symbol (2);console .log (sym ===sym );
tsconsole .log (Symbol ("piano") ==Symbol ("piano"));console .log (Symbol ("piano") ===Symbol ("piano"));constsym =Symbol (2);console .log (sym ===sym );
Giá trị kiểu object
Kiểu object, dù so sánh các object có cùng cặp property và value, nếu không tham chiếu đến cùng một biến thì sẽ trả về false. Đây là hành vi đương nhiên với những người hiểu về object.
js// JavaScriptconsole .log ({} == {});console .log ({} === {});console .log ({age : 18 } == {age : 18 });console .log ({equipment : "glasses" } === {equipment : "glasses" });constobj = {hair : "blond" };console .log (obj ===obj );
js// JavaScriptconsole .log ({} == {});console .log ({} === {});console .log ({age : 18 } == {age : 18 });console .log ({equipment : "glasses" } === {equipment : "glasses" });constobj = {hair : "blond" };console .log (obj ===obj );