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ử =====

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.