Số trong JavaScript
JavaScript chỉ có một loại số trị.
Viết số trị có thể có hoặc không có dấu chấm.
JavaScript số trị
Viết giá trị số trong JavaScript có thể có dấu chấm hoặc không có dấu chấm:
Mô hình
var x = 3.14; // Số có dấu chấm var y = 3; // Số không có dấu chấm
Số lớn hoặc nhỏ siêu có thể được viết dưới dạng số học:
Mô hình
var x = 123e5; // 12300000 var y = 123e-5; // 0.00123
Giá trị số trong JavaScript luôn là số thập phân 64 bit
Khác với nhiều ngôn ngữ lập trình khác, JavaScript không định nghĩa các loại số khác nhau, chẳng hạn như số nguyên, ngắn, dài, số thập phân, v.v.
Giá trị số trong JavaScript luôn được lưu trữ dưới dạng số thập phân kép, theo tiêu chuẩn quốc tế IEEE 754.
Định dạng này sử dụng 64 bit để lưu trữ giá trị, trong đó từ 0 đến 51 lưu trữ số (mảnh), từ 52 đến 62 lưu trữ指数, và 63 bit lưu trữ dấu:
Giá trị (gọi là Phân số/Mantissa) | C指数 | Dấu |
---|---|---|
52 bits(0 - 51) | 11 bits (52 - 62) | 1 bit (63) |
Độ chính xác
Số nguyên (không sử dụng hệ số hoặc biểu thức số học) sẽ chính xác đến 15 chữ số.
Mô hình
var x = 999999999999999; // x sẽ là 999999999999999 var y = 9999999999999999; // y sẽ là 10000000000000000
Số thập phân lớn nhất là 17 chữ số, nhưng toán học phân số không luôn luôn chính xác 100%:
Mô hình
var x = 0.2 + 0.1; // x sẽ là 0.30000000000000004
Sử dụng phép nhân chia giúp giải quyết vấn đề trên:
Mô hình
var x = (0.2 * 10 + 0.1 * 10) / 10; // x sẽ là 0.3
Cộng số và chuỗi
Cảnh báo !!
Cộng và nối chuỗi trong JavaScript đều sử dụng toán tử +.
Số sử dụng phép cộng. Chuỗi sử dụng nối chuỗi.
Nếu cộng hai số, kết quả sẽ là một số:
Mô hình
var x = 10; var y = 20; var z = x + y; // z sẽ là 30 (một số)
Nếu cộng hai chuỗi, kết quả sẽ là nối chuỗi của chuỗi:
Mô hình
var x = "10"; var y = "20"; var z = x + y; // z sẽ là 1020 (chuỗi)
Nếu bạn cộng một số với một chuỗi, kết quả cũng là nối chuỗi:
Mô hình
var x = 10; var y = "20"; var z = x + y; // z sẽ là 1020 (một chuỗi)
Nếu bạn cộng một chuỗi với một số, kết quả cũng sẽ là nối chuỗi:
Mô hình
var x = "10"; var y = 20; var z = x + y; // z sẽ là 1020 (chuỗi)
Lỗi phổ biến là cho rằng kết quả nên là 30:
Mô hình
var x = 10; var y = 20; var z = "Kết quả là: " + x + y;
Lỗi phổ biến là cho rằng kết quả nên là 102030:
Mô hình
var x = 10; var y = 20; var z = "30"; var result = x + y + z;
JavaScript dịch từ trái sang phải.
Vì x và y đều là số, 10 + 20 sẽ được cộng.
Vì z là chuỗi, 30 + "30" sẽ được nối.
Chuỗi số
Chuỗi của JavaScript có thể chứa nội dung số:
var x = 100; // x là số var y = "100"; // y là chuỗi
Trong tất cả các phép toán số, JavaScript sẽ cố gắng chuyển đổi chuỗi thành số:
Ví dụ này sẽ chạy như sau:
var x = "100"; var y = "10"; var z = x / y; // z sẽ là 10
Ví dụ này cũng sẽ chạy như sau:
var x = "100"; var y = "10"; var z = x * y; // z sẽ là 1000
Ví dụ này sẽ chạy như sau:
var x = "100"; var y = "10"; var z = x - y; // z sẽ là 90
Nhưng ví dụ này sẽ không chạy như trên:
var x = "100"; var y = "10"; var z = x + y; // z sẽ không phải là 110 (mà là 10010)
Trong ví dụ cuối cùng, JavaScript đã nối chuỗi bằng toán tử +.
NaN - Không phải số
NaN
Là từ khóa bảo vệ của JavaScript, chỉ ra rằng một số không phải là số hợp lệ.
Thử chia bằng một chuỗi không phải số sẽ nhận được NaN (Not a Number):
Mô hình
var x = 100 / "Apple"; // x sẽ là NaN (Not a Number)
Nhưng nếu chuỗi chứa giá trị số, kết quả sẽ là số:
Mô hình
var x = 100 / "10"; // x sẽ là 10
Bạn có thể sử dụng hàm JavaScript toàn cục: isNaN()
để xác định một giá trị có phải là số hay không:
Mô hình
var x = 100 / "Apple"; isNaN(x); // Trả về true vì x không phải là số
hãy cẩn thận NaN
。Nếu bạn sử dụng trong toán học NaN
thì kết quả cũng sẽ là NaN
:
Mô hình
var x = NaN; var y = 5; var z = x + y; // z sẽ là NaN
Kết quả có thể là chuỗi nối:
Mô hình
var x = NaN; var y = "5"; var z = x + y; // z sẽ là NaN5
NaN
là số,typeof NaN
trả về number
:
Mô hình
typeof NaN; // Trả về "number"
Infinity
Infinity
hoặc -Infinity
) là giá trị mà JavaScript trả về khi tính toán số vượt quá phạm vi số có thể.
Mô hình
var myNumber = 2; while (myNumber != Infinity) { // Thực hiện đến Infinity myNumber = myNumber * myNumber; }
cộng với 0 (không) cũng sẽ tạo ra Infinity
:
Mô hình
var x = 2 / 0; // x sẽ là Infinity var y = -2 / 0; // y sẽ là -Infinity
Infinity
là số:typeOf Infinity
trả về number
。
Mô hình
typeof Infinity; // Trả về "number"
mười sáu phân
JavaScript sẽ giải thích số có tiền tố 0x
giá trị thường số được giải thích là mười sáu phân.
Mô hình
var x = 0xFF; // x sẽ là 255.
Không bao giờ viết số với số lẻ đầu (ví dụ: 07).
Một số phiên bản JavaScript sẽ giải thích số có số lẻ đầu là tám phân.
Mặc định, Javascript sẽ hiển thị số dưới dạng số thập phân.
Nhưng bạn có thể sử dụng toString()
Phương pháp này sẽ xuất ra số dưới dạng nhị phân, tám phân hoặc mười sáu phân.
Mô hình
var myNumber = 128; myNumber.toString(16); // Trả về 80 myNumber.toString(8); // Trả về 200 myNumber.toString(2); // Trả về 10000000
Giá trị số có thể là đối tượng
Thường thì các giá trị số trong JavaScript được tạo thành từ các giá trị nguyên thủy: var x = 123
Nhưng cũng có thể thông qua từ khóa new
Được định nghĩa là đối tượng: var y = new Number(123)
Mô hình
var x = 123; var y = new Number(123); // typeof x trả về number // typeof y trả về object
Hãy không tạo đối tượng số. Điều này sẽ làm chậm tốc độ thực thi.
new
Từ khóa làm cho mã phức tạp hơn và gây ra một số kết quả không mong đợi:
Khi sử dụng ==
Khi sử dụng toán tử bằng, số bằng nhau trông bằng nhau:
Mô hình
var x = 500; var y = new Number(500); // (x == y) là true vì x và y có giá trị bằng nhau
Khi sử dụng ===
Sau khi sử dụng toán tử bằng, số bằng nhau trở thành không bằng nhau vì ===
Điều kiện cần thiết là cả loại và giá trị phải bằng nhau.
Mô hình
var x = 500; var y = new Number(500); // (x === y) là false vì x và y có loại khác nhau
Thậm chí còn tệ hơn. Đối tượng không thể so sánh:
Mô hình
var x = new Number(500); var y = new Number(500); // (x == y) là false vì đối tượng không thể so sánh
JavaScript đối tượng không thể so sánh.