1. Khái niệm về kiểu số trong JavaScript
Trong Js chỉ có khái niệm một kiểu số. Tứ là ở đây nó sẽ hỗ trợ cả số nguyên (integer) và số có dấu phẩy động (floating-point) có thể được biểu thị bằng ký hiệu thập phân, thập lục phân hoặc bát phân. Nhưng không giống như các ngôn ngữ khác, JavaScript không xử lý các số nguyên và dấu phẩy động khác nhau. Tất cả các số trong JavaScript được biểu diễn dưới dạng số dấu phẩy động.
Ví dụ:
let x = 3.14; // Một số có số thập phân let y = 3; // Một số không có số thập phân
Các số cực lớn hoặc cực nhỏ thì ta có thể viết bằng ký hiệu khoa học(số mũ) để biểu diễn nó.
Ví dụ:
let x = 123e5; // 12300000 let y = 123e-5; // 0.00123
Không giống với các ngôn ngữ lập trình khác, các số trong Javascript luôn luôn là 64 bít và kiểu float, vì vậy bạn không thể định nghĩa các kiểu dữ liệu như integer, short, long.. Hay nói cach khác, trong Javascript khi làm việc với các chữ số thì chỉ có khái niệm Number.
Tất cả các dữ liệu liên quan đến những con số đều có kiểu dữ liệu là Number
, nghĩa là bạn dùng hàm typeof thì sẽ có kết quả trả về là ‘number’.
var x = 1223; var y = 1.253; typeof 12; // number typeof x; // number typeof y; // number
Chú ý
- Số nguyên an toàn lớn nhất trong JavaScript là 9007199254740991 (2^53-1), trong khi số nguyên an toàn nhỏ nhất là -9007199254740991 (- (2^53-1)).
- Số nguyên có thể được biểu diễn dưới dạng ký hiệu thập phân, thập lục phân và bát phân. Số dấu phẩy động có thể được biểu diễn bằng ký hiệu thập phân hoặc số mũ.
2. Độ chính xác của số trong JavaScript
Số nguyên (số mà không có ký hiệu số mũ) được coi là chính xác lên đến 15 chữ số. Số thận phân tối đa là 17 số. Nhưng dấu chấm động sẽ không phải lúc nào cũng chính xác 100%
Ví dụ:
var x = 999999999999999; // x sẽ là 999999999999999 var y = 9999999999999999; // y sẽ trả về kết quả 10000000000000000 var x = 0.2 + 0.1; // x sẽ có giá trị là 0.30000000000000004
Để giải quyết vấn đề cho số thập phân, ta phải nhân nó rồi chia ra
var x = (0.2 * 10 + 0.1 * 10) / 10; // x sẽ có giá trị 0.3
3. Các phép toán trên số trong JavaScript
Tương tự như trong đại số, chúng ta có bốn phép toán cơ bản (cộng, trừ, nhân, chia) dùng để thực hiện việc tính toán trên các con số.
Ví dụ:
var a = 35 + 5; //biến a sẽ có giá trị là số 40 var b = 35 - 5; //biến a sẽ có giá trị là số 30 var c = 35 * 5; //biến a sẽ có giá trị là số 175 var d = 35 / 5;/ //biến a sẽ có giá trị là số 7
Có một trường hợp đặc biệt, nếu trong phép toán chứa toán hạng là số nhưng lại bị đặt bên trong cặp dấu nháy kép hoặc cặp dấu nháy đơn, thì JavaScript sẽ cố gắng xem toán hạng đó như là một số.
var a = 35 - "5"; //biến a sẽ có giá trị là 30 var b = "35" * 5; //biến b sẽ có giá trị là 175 var c = "35" / "5"; //biến c sẽ có giá trị là 7
Ở trường hợp đặc biệt trên, nếu toán tử là phép cộng thì nó sẽ bị chuyển thành dạng ghép chuỗi.
var a = 35 + "5"; //biến a sẽ có giá trị là 355 var b = "72" + 3; //biến b sẽ có giá trị là 723 var c = "16" + "4"; //biến c sẽ có giá trị là 164
4. Thao tác với số và chuỗi trong JavaScript
Như bạn đã được học từ bài trước, toán tử + được sử dụng cho cả phép cộng và phép nối. Nhưng bạn hãy xem điều thú vị sau nhé:
var x = 10; var y = 20; var z = "30"; // Cộng một số với một số. Kết quả là số console.log(x + y); // 30 // Cộng một chuỗi với một chuỗi. Kết quả là chuỗi console.log(z + z); // '3030' // Cộng một số với một chuỗi. Kết quả là chuỗi. console.log(x + z); // '1030' // Cộng một chuỗi với một số. Kết quả là chuỗi console.log(z + x); // '3010' // Cộng chuỗi với số. Kết quả là chuỗi console.log("Kết quả là: " + x + y); // 'Kết quả là: 1020' // Cộng số với chuỗi. Kết quả là chuỗi console.log(x + y + z); // '3030'
Ở những câu lệnh cuối, kết quả sẽ rất bất ngờ. Đơn giản là vì toán tử được ưu tiên đánh giá từ trái qua phải. Đó là lý do tại sao, nó cộng x và y trước, sau đó mới lấy kết quả cộng với chuỗi z, do đó kết quả cuối cùng được 30 + ’30’ = ‘3030’. Nhưng nếu ta thực hiện phép nhân chia hay trừ thì Js tự động chuyển đổi các chuỗi số (nghĩa là các chuỗi chứa các giá trị số) thành các số trong tất cả các hoạt động số.
Ví dụ:
var x = 10; var y = 20; var z = "30"; // Trừ một số cho một số console.log(y - x); // 10 // Trừ một chuỗi cho một số console.log(z - x); // 20 // Nhân một số với một chuỗi console.log(x * z); // 300 // Chia một chuỗi cho một số console.log(z / x); // 3
5. NaN – Không phải là số
NaN là một từ dành riêng cho Js. Nó chỉ ra rằng một số không phải là một số hợp pháp. Các phép toán với một chuỗi không phải là số sẽ cho ra kết quả NaN (Not a Number)
Ví dụ:
var a = 2021 - "Lập Trình Web"; //Biến a sẽ có giá trị là NaN var b = 2021 * "Lập Trình Js"; //Biến b sẽ có giá trị là NaN var c = 2021 / "Lập Trình PHP";/ //Biến c sẽ có giá trị là NaN
Nếu thực hiện phép toán bất kỳ giữa một số nào đó với giá trị NaN thì nó sẽ cho ra giá trị NaN:
var a = 1993 + NaN; //Biến a sẽ có giá trị là NaN var b = 1993 - NaN; //Biến b sẽ có giá trị là NaN var c = 1993 * NaN; //Biến c sẽ có giá trị là NaN var d = 1993 / NaN; / //Biến d sẽ có giá trị là NaN
Nếu bạn sử dụng NaN như một toán tử, kết quả sẽ cho ra NaN:
var x = NaN; var y = 7; var z = x + y; // z sẽ là NaN
Hay kết quả có thể là một phép nối:
let x = NaN; let y = "5"; let z = x + y;
Điều thú vị có phần kỳ lạ là JavaScript xếp kiểu là của NaN là một số. Khi sử dụng typeof ta sẽ thấy kết quả trả về là một số:
typeof NaN; // kết quả trả về là "số" ("number")
6. Giá trị vô cùng trong kiểu số
Dương vô cùng (hoặc âm vô cùng) là giá trị JavaScript sẽ trả về nếu bạn tính toán một số nằm ngoài con số lớn nhất có thể. Infinity (hoặc -Infinity) là giá trị Js sẽ trả về nếu bạn tính một số bên ngoài số lớn nhất có thể.
Ví dụ:
var myNumber = 2; while (myNumber != Infinity) { // Tính toán cho đến khi vượt mốc số lớn nhất myNumber = myNumber * myNumber; }
Phép chia cho 0 cũng tạo ra infinity :
let x = 2 / 0; let y = -2 / 0;
Kiểu dữ liệu của infinity cũng sẽ trả về là number:
typeof Infinity;
7. Số trong JavaScript cũng có thể là đối tượng
Thông thường số trong JavaScript là giá trị thuần tuý được tạo ra từ các ký tự biểu thị số: var x = 876. Nhưng các con số cũng có thể được định nghĩa như là các đối tượng với từ khoá new : var y = new Number(876)
Ví dụ:
let x = 123; let y = new Number(123);
Nhưng một lời khuyên cho các bạn mà các bạn nên nhớ nhé. Đừng tạo Số thành đối tượng. Điều này có thể làm chậm tốc độ xử lý. Từ khoá new làm code trở nên phức tạp. Điều này có thể tạo ra một số kết quả không mong muốn.
Ta cũng sẽ có sự khác nhau khi sử dụng 2 toán tử == và ===
let x = 500; let y = new Number(500); document.getElementById("demo").innerHTML = (x===y);//false document.getElementById("demo").innerHTML = (x==y);//true
Vì sao lại có sự khác biệt này. Đơn giản vì khi sử dụng toán tử === yêu cầu cả giá trị và kiểu phải như nhau. Mặc dù giá trị thuần tuý giống nhau, nhưng kiểu của chúng thì khác nhau.
Chú ý
So sánh hai đối tượng JavaScript luôn trả về false
var x = new Number(500); var y = new Number(500);// (x == y) là false, bởi vì các đối tượng (object) không thể so sánh.