Tại sao ít khi chuyển kiểu dữ liệu khác sang Object?
Trong JavaScript, việc chuyển đổi từ các kiểu dữ liệu đơn giản sang Object không phổ biến do cấu trúc dữ liệu và mức độ phức tạp khác nhau. Ví dụ, chuyển một số hoặc chuỗi thành Object có thể không mang lại giá trị thực tế và làm tăng độ phức tạp của code.
Quy tắc ép kiểu ngầm trong JavaScript
Ép kiểu ngầm với toán tử so sánh ==
Trong JavaScript, khi so sánh hai giá trị
x và y với nhau bằng cách sử dụng x == y, kết quả sẽ trả về true hoặc false. Quá trình so sánh này được thực hiện như sau:- Nếu
xvàycùng kiểu dữ liệu: - Nếu cả hai là
undefinedhoặcnull, trả vềtrue. - Nếu là số:
- Nếu một trong hai là
NaN, trả vềfalse. - Nếu cả hai số giống hệt nhau, trả về
true. - Nếu là chuỗi, so sánh từng ký tự (cùng độ dài và giống nhau từng ký tự theo vị trí) để xác định chúng có giống hệt nhau không.
- Nếu là boolean, trả về
truenếu cả hai cùngtruehoặc cùngfalse. xlànullvàylàundefined, hoặc ngược lại, trả vềtrue.- Nếu một trong hai là số và cái kia là chuỗi, chuyển đổi chuỗi thành số rồi so sánh.
- Nếu một trong hai là boolean, chuyển đổi boolean thành số rồi so sánh.
- Nếu một trong hai là đối tượng và cái kia là chuỗi hoặc số, chuyển đổi đối tượng thành giá trị nguyên thủy rồi so sánh.
- Nếu không thỏa mãn các trường hợp trên, trả về
false.
Trong trường hợp “Nếuxlànullvàylàundefined, hoặc ngược lại, trả vềtrue,” không có sự ép kiểu ngầm định giữanullvàundefined. Đây là một quy tắc đặc biệt trong JavaScript khi sử dụng toán tử so sánh bằng lỏng lẻo (==). Theo quy tắc này,nullvàundefinedđược coi là bằng nhau mà không cần chuyển đổi kiểu dữ liệu của chúng. Điều này có nghĩa là không có sự chuyển đổi kiểu dữ liệu nào xảy ra; JavaScript đơn giản chỉ coi chúng là giống nhau trong trường hợp cụ thể này (so sánh==).
Ép kiểu ngầm với toán tử số học
Toán tử cộng (+)
Trong JavaScript, toán tử cộng (
+) có thể thực hiện cả phép cộng số học và nối chuỗi. Cách hoạt động của nó được xác định như sau:- Xem xét giá trị của biểu thức bên trái và bên phải của toán tử.
- Chuyển đổi giá trị này sang kiểu nguyên thủy (ToPrimitive).
- Nếu một trong hai giá trị sau khi chuyển đổi là chuỗi, thực hiện nối chuỗi.
- Nếu không, chuyển đổi cả hai giá trị sang số (ToNumber) và thực hiện phép cộng.
Ví dụ:
"5" + 2sẽ có kết quả là"52"(nối chuỗi).5 + "2"cũng sẽ trở thành"52".5 + 2sẽ có kết quả là7(phép cộng số).
Toán tử trừ (-)
Toán tử trừ (
-) chỉ thực hiện phép trừ số học. Trong quá trình này, toán tử trừ chuyển đổi cả hai giá trị sang số rồi mới thực hiện phép trừ.5 - "2"sẽ trả về3(chuyển"2"thành số)."10" - "2"sẽ trả về8(chuyển"10"và"2"thành số).
Tham khảo thêm: https://262.ecma-international.org/5.1/#sec-11.9.3
Bảng chuyển đổi kiểu dữ liệu
Bảng dưới đây cung cấp một cái nhìn tổng quan về cách các giá trị khác nhau trong JavaScript được chuyển đổi sang các kiểu dữ liệu
Number, String và Boolean.| Giá trị gốc | Chuyển thành số | Chuyển thành chuỗi | Chuyển thành boolean |
|---|---|---|---|
| false | 0 | “false” | false |
| true | 1 | “true” | true |
| 0 | 0 | “0” | false |
| 1 | 1 | “1” | true |
| “0” | 0 | “0” | true |
| “000” | 0 | “000” | true |
| “1” | 1 | “1” | true |
| NaN | NaN | “NaN” | false |
| Infinity | Infinity | “Infinity” | true |
| -Infinity | -Infinity | “-Infinity” | true |
| “” | 0 | “” | false |
| “20” | 20 | “20” | true |
| “twenty” | NaN | “twenty” | true |
| [] | 0 | “” | true |
| [20] | 20 | “20” | true |
| [10, 20] | NaN | “10,20” | true |
| [“twenty”] | NaN | “twenty” | true |
| [“ten”, “twenty”] | NaN | “ten,twenty” | true |
| function sum() {} | NaN | “function sum() {}” | true |
| {} | NaN | “[object Object]” | true |
| null | 0 | “null” | false |
| undefined | NaN | “undefined” | false |
Giá trị màu đỏ chỉ các giá trị mà một số lập trình viên có thể không mong đợi.
Tham khảo thêm: https://www.w3schools.com/js/js_type_conversion.asp
Lưu ý quan trọng
- Nên sử dụng toán tử so sánh nghiêm ngặt: Để tránh những hành vi không mong muốn từ ép kiểu ngầm, nên sử dụng toán tử
===. Toán tử này chỉ trả vềtruekhi cả hai giá trị có cùng kiểu dữ liệu và giá trị. - Tư duy nghiêm ngặt với kiểu dữ liệu: Khi lập trình, hãy chú ý đến việc sử dụng cùng kiểu dữ liệu trong so sánh và các phép tính toán. Điều này giúp tránh những lỗi logic không mong muốn.