Chuyển đổi kiểu dữ liệu tự động
Như bạn đã biết, chuỗi trong JavaScript nên được đặt trong dấu ngoặc kép. Có thể xảy ra trường hợp tất cả các ký tự của chuỗi đều là chữ số:
let a = '123';
Trong trường hợp này, biến a cũng là
một chuỗi, nhưng có một điểm đặc biệt.
Bản chất của điểm đặc biệt đó là: nếu thực hiện một phép toán nào đó trên chuỗi có chữ số - phép toán đó sẽ được thực hiện như thể chúng ta thực sự có số, chứ không phải chuỗi:
alert('2' * '3'); // sẽ hiển thị 6
Trong trường hợp này, JavaScript thấy rằng chúng ta đang cố gắng thực hiện một phép toán không hợp lệ đối với chuỗi, nhưng hợp lệ đối với số.
Nó cũng thấy rằng trên thực tế, các chuỗi của chúng ta - là những số trong dấu ngoặc kép. Do đó, JavaScript tự động thực hiện chuyển đổi các chuỗi này thành số và thực hiện phép toán tương ứng trên chúng.
Điều này hoạt động nếu trong chuỗi của chúng ta chỉ có
chữ số. Nếu có ít nhất một chữ cái
- JavaScript sẽ coi phép toán đó không chính xác
và cho kết quả là giá trị NaN:
alert('2' * '3s'); // sẽ hiển thị NaN
Ngoài ra, chuyển đổi tự động xảy ra nếu phép toán chính xác về mặt toán học, nhưng không hợp lệ đối với chuỗi.
Ví dụ, chuỗi không thể (nhưng số có thể) nhân, chia, trừ, do đó trong tất cả các phép toán như vậy sẽ có chuyển đổi tự động chuỗi có chữ số thành số.
Tuy nhiên, chuỗi, cũng như số, có thể cộng lại
với nhau bằng toán tử +. Điều này có nghĩa là
trong trường hợp phép cộng sẽ không có chuyển đổi tự động
xảy ra:
let a = '1' + '2';
alert(a); // sẽ hiển thị '12' - đã xảy ra phép cộng chuỗi
Nếu một số hạng là số, và số hạng kia - là chuỗi, thì chuỗi luôn chiến thắng:
let a = 1 + '2';
alert(a); // sẽ hiển thị '12'
Trong những trường hợp như vậy, JavaScript, ngược lại, tự động chuyển đổi số thành chuỗi và thực hiện phép cộng chuỗi.
Tuy nhiên, có những điểm đặc biệt khi có nhiều hơn hai số hạng: trong trường hợp này, việc chuyển đổi sang một kiểu cụ thể phụ thuộc vào thứ tự thực hiện các phép toán.
Trong ví dụ tiếp theo, đầu tiên 2 và 3
sẽ được cộng lại như số, sau đó kết quả sẽ được cộng
với chuỗi '1' dưới dạng chuỗi '5',
cuối cùng cho ra chuỗi '15':
let a = '1' + (2 + 3);
alert(a); // sẽ hiển thị '15'
Nếu bỏ dấu ngoặc đơn, thì tất cả sẽ được cộng
từ trái sang phải. Tức là đầu tiên chuỗi '1'
sẽ được cộng với số 2 và kết quả
sẽ là chuỗi '12'. Sau đó chuỗi này
sẽ được cộng với số 3 và kết quả
sẽ là chuỗi '123':
let a = '1' + 2 + 3;
alert(a); // sẽ hiển thị '123'
Nhưng trong ví dụ tiếp theo, các số 2
và 3 được viết ở đầu, vì vậy đầu tiên
chúng sẽ được cộng lại như số, cho kết quả
là số 5, sau đó số này sẽ được cộng với
chuỗi '1', cuối cùng cho ra chuỗi '51':
let a = 2 + 3 + '1';
alert(a); // sẽ hiển thị '51'
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = '5' + '2';
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = '5' + 2;
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = 5 + '2';
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = 5 + 2;
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = '5' * '2';
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = '5' - '2';
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = '5' / '2';
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = '5' % '2';
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = '5s' * '2';
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = '5s' + '2';
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = (-'5') + (-'2');
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = '5' * 1 + '2' * 1;
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = '5' * '1' + '2' * '1';
alert(a);
Không chạy code, hãy xác định điều gì sẽ được hiển thị trên màn hình:
let a = '' + 3 + 1;
alert(a);