Giả sử chúng tôi có một đoạn mã ở đây tạo ra một số kết quả đáng ngạc nhiên. Đầu tiên, chúng ta thấy rằng toán tử modulo cũng hoạt động tốt với các chuỗi (đáng ngạc nhiên). Thứ hai, nối hai chuỗi tạo ra kết quả khó hiểu.
Chúng ta cần giải thích tại sao JavaScript lại làm như vậy?
Đây là mã sự cố -
Ví dụ
const numStr = '127'; const result = numStr % 5; const firstName = 'Armaan'; const lastName = 'Malik'; const fullName = firstName + + lastName; console.log('modulo result: ', result); console.log('full name: ', fullName);
Đầu ra
modulo result: 2 full name: ArmaanNaN
Trước khi bắt đầu viết mã, trước tiên chúng ta hãy tìm hiểu một chút về một trong những chủ đề cơ bản nhất của JavaScript → Type Coercion.
Loại cưỡng chế
Về cơ bản, cưỡng chế kiểu là một cách được các trình biên dịch JavaScript sử dụng để thay đổi kiểu dữ liệu này thành kiểu dữ liệu khác. Ví dụ về cưỡng chế kiểu hợp lệ sẽ thay đổi chuỗi thành boolean, số thành chuỗi, v.v.
Ép buộc loại là một chủ đề rất rộng lớn và để hạn chế độ dài của giải pháp này, chúng tôi sẽ chỉ khám phá những thứ được sử dụng trong đoạn mã này. Trong số hai kiểu cưỡng chế kiểu, một kiểu do trình biên dịch tự động thực hiện được gọi là kiểu ép buộc ngầm định.
Nó sau -
Mọi kiểu dữ liệu (nguyên thủy hoặc không nguyên thủy) sẽ bị ép buộc hoàn toàn thành -
-
Chuỗi (khi được sử dụng với toán tử nhị phân +).
-
Số (khi được sử dụng với các toán tử số học như +, -, /, *,% và chỉ các trình kích hoạt + một bậc
Ép buộc số không phải nhị phân +, khi được sử dụng với toán tử so sánh, toán tử bitwise hoặc toán tử bình đẳng thua [==])
-
Boolean (khi được sử dụng với các toán tử logic &|!)
*** Một điều cần lưu ý nữa là mức độ ưu tiên của toán tử đơn phân (+) cao hơn toán tử nhị phân (+).
Giải thích mã
Vì vậy, với những điều này rõ ràng, hãy chuyển sang mã và thực hiện từng dòng một -
Line 2 → result = '127' % 5;
Ép buộc ngầm nhận vào và nhìn thấy toán tử%, vì nó chuyển đổi Chuỗi ‘127’ thành Số 127 và 2 được lưu trữ trong kết quả -
Line 5 → fullName = firstName + + lastName;
fullName = firstName + (+lastName);
Trong quá trình bình thường, việc tính toán sẽ diễn ra từ trái sang phải nhưng do không có quyền sử dụng toán tử đơn phân, nó sẽ được tính thành Number trước và phép toán trở thành likethis -
fullName = firstName + NaN;
Và sau đó
fullName = ArmaanNaN