Sunday, September 29, 2024

[Javascript] – Phần 21: JavaScript Numbers

-

Trong JavaScript chỉ có một loại số duy nhất, khác với nhiều ngôn ngữ lập trình khác như integer, short, long, floating-point, v.v… Số có thể được viết với hoặc không có phần thập phân.

Ví dụ:

let x = 3.14;    // Một số có phần thập phân
let y = 3;       // Một số không có phần thập phân

Số lớn hoặc nhỏ quá có thể được viết dưới dạng biểu diễn số học (mũ):

Ví dụ:

let x = 123e5;    // 12300000
let y = 123e-5;   // 0.00123

JavaScript chỉ có một loại số, khác với nhiều ngôn ngữ lập trình khác như integer, short, long, floating-point, v.v.

Các số JavaScript luôn được lưu trữ dưới dạng số thực 64-bit theo tiêu chuẩn quốc tế IEEE 754. Định dạng này lưu trữ số trong 64 bit, trong đó phần số (fraction) được lưu trong bit từ 0 đến 51, bậc số mũ lưu trong bit từ 52 đến 62 và dấu lưu trong bit 63.

Kiểu số nguyên và số thực trong JavaScript.

Chính xác của số nguyên (không có dấu chấm hoặc biểu diễn số học) là tới 15 chữ số:

Ví dụ:

let x = 999999999999999;   // x sẽ là 999999999999999
let y = 9999999999999999;  // y sẽ là 10000000000000000

Tuy nhiên, số thực có thể không chính xác 100% trong các phép toán:

let x = 0.2 + 0.1;

Để giải quyết vấn đề trên, có thể nhân và chia:

let x = (0.2 * 10 + 0.1 * 10) / 10;

Trong JavaScript, toán tử + được sử dụng để cả cộng và nối chuỗi.

Toán tử trong Number.

Khi bạn cộng hai số kết quả sẽ là một số:

let x = 10;
let y = 20;
let z = x + y;

Ở đây, z sẽ là 30 vì xy là cả hai là số.

Khi bạn cộng hai chuỗi kết quả sẽ là nối chuỗi:

let x = "10";
let y = "20";
let z = x + y;

Ở đây, z sẽ là chuỗi “1020” vì xy đều là chuỗi, không phải số.

Nếu bạn cộng một số và một chuỗi, kết quả cũng sẽ là nối chuỗi:

let x = 10;
let y = "20";
let z = x + y;

Ở đây, z sẽ là chuỗi “1020” vì JavaScript chuyển đổi số x thành chuỗi để thực hiện nối chuỗi.

Tương tự, nếu bạn cộng một chuỗi và một số kết quả sẽ là nối chuỗi:

let x = "10";
let y = 20;
let z = x + y;

Ở đây, z sẽ là chuỗi “1020” vì JavaScript chuyển đổi số y thành chuỗi để thực hiện nối chuỗi.

Một lỗi phổ biến là mong đợi kết quả của biểu thức là số 30:

let x = 10;
let y = 20;
let z = "The result is: " + x + y;

Nhưng kết quả thực sự là chuỗi “The result is: 1020”. Điều này xảy ra vì trình biên dịch JavaScript hoạt động từ trái sang phải. Trước hết, 10 + 20 được cộng vì x và y đều là số. Sau đó, kết quả của phép cộng được nối với chuỗi “The result is:”.

Trong JavaScript, chuỗi có thể chứa nội dung số:

let x = 100;         // x là một số

let y = "100";       // y là một chuỗi

JavaScript sẽ cố gắng chuyển đổi chuỗi thành số trong tất cả các phép toán số học:

Điều này sẽ hoạt động:

let x = "100";
let y = "10";
let z = x / y;

Và điều này cũng sẽ hoạt động:

let x = "100";
let y = "10";
let z = x * y;

Và điều này cũng sẽ hoạt động:

let x = "100";
let y = "10";
let z = x - y;

Nhưng điều này sẽ không hoạt động:

let x = "100";
let y = "10";
let z = x + y;

Trong ví dụ cuối cùng, JavaScript sử dụng toán tử + để nối các chuỗi vì cả xy đều là chuỗi. Do đó, thay vì thực hiện phép cộng số học, nó thực hiện phép nối chuỗi và kết quả là chuỗi “10010”.

NaN chỉ ra một số không phải là một giá trị số hợp lệ.

Trong JavaScript, NaN là một từ khoá được sử dụng để chỉ ra rằng một số không phải là một giá trị số hợp lệ.

Nếu bạn thực hiện phép toán số học với một chuỗi không phải là số, kết quả sẽ là NaN (Not a Number):

let x = 100 / "Apple";

Tuy nhiên, nếu chuỗi là số, kết quả sẽ là một số:

let x = 100 / "10";

Bạn có thể sử dụng hàm toàn cục isNaN() trong JavaScript để kiểm tra xem một giá trị có phải là số hay không:

let x = 100 / "Apple";
isNaN(x);

Hãy cẩn thận với NaN. Nếu bạn sử dụng NaN trong một phép toán số học, kết quả cũng sẽ là NaN:

let x = NaN;
let y = 5;
let z = x + y;

Hoặc kết quả có thể là một chuỗi nối như NaN5:

let x = NaN;
let y = "5";
let z = x + y;

Lưu ý rằng NaN cũng được coi là một số: typeof NaN trả về là “number”:

typeof NaN;

Vì vậy, khi kiểm tra kiểu dữ liệu của NaN, kết quả sẽ là “number”.

Giá trị Infinity (hoặc -Infinity)

Trong JavaScript, Infinity (hoặc -Infinity) là giá trị mà JavaScript sẽ trả về nếu bạn thực hiện một phép toán số mà vượt ra khỏi giới hạn của số lớn nhất có thể biểu diễn.

Ví dụ:

let myNumber = 2;
// Thực hiện cho đến khi đạt tới Infinity
while (myNumber != Infinity) {
  myNumber = myNumber * myNumber;
}

Ở đây, vòng lặp sẽ thực hiện cho đến khi myNumber đạt tới giá trị Infinity.

Phép chia cho 0 cũng tạo ra giá trị Infinity:

let x = 2 / 0;
let y = -2 / 0;

Ở đây, xy đều sẽ có giá trị là Infinity.

Infinity cũng được xem là một số khi sử dụng toán tử typeof, và typeof Infinity sẽ trả về “number”:

typeof Infinity;

Điều này chỉ ra rằng trong ngữ cảnh của JavaScript, Infinity được coi là một giá trị số, đại diện cho vô cực và có thể xuất hiện trong các trường hợp như phép toán vượt ra khỏi phạm vi biểu diễn của số.

Hexadecimal.

Trong JavaScript, nếu bạn muốn biểu diễn một hằng số số học dưới dạng hệ thống số Hexadecimal, bạn có thể sử dụng tiền tố “0x”.

Ví dụ:

let x = 0xFF; // Đây là một hằng số hexadécimal, có giá trị là 255 khi được chuyển sang hệ thập phân.

Lưu ý rằng không nên viết số với số 0 đầu tiên (ví dụ như 07), vì một số phiên bản JavaScript có thể hiểu là số bát phân nếu có số 0 ở đầu.

Mặc định, JavaScript hiển thị số dưới dạng thập phân hệ 10. Tuy nhiên, bạn có thể sử dụng phương thức toString() để xuất các số từ hệ 2 đến hệ 36.

Ví dụ:

let myNumber = 32;
myNumber.toString(32); // Chuyển số sang hệ cơ số 32
myNumber.toString(16); // Chuyển số sang hệ cơ số 16 (hexadécimal)
myNumber.toString(12); // Chuyển số sang hệ cơ số 12
myNumber.toString(10); // Chuyển số sang hệ cơ số 10 (thập phân)
myNumber.toString(8);  // Chuyển số sang hệ cơ số 8 (bát phân)
myNumber.toString(2);  // Chuyển số sang hệ cơ số 2 (nhị phân)

Điều này cho phép bạn chuyển đổi giữa các hệ cơ số khác nhau cho một số cụ thể.

Khai báo Number bằng cách thủ công và bằng new.

Trong JavaScript, thông thường các số được tạo ra thủ công:

let x = 123;

Tuy nhiên, số cũng có thể được định nghĩa dưới dạng đối tượng với new:

let y = new Number(123);

Việc tạo số dưới dạng đối tượng bằng từ khóa new không được khuyến khích. Việc này làm phức tạp mã code và làm chậm tốc độ thực thi.

Các đối tượng số có thể tạo ra kết quả không mong muốn:

Khi sử dụng toán tử ==, x và y sẽ bằng nhau:

let x = 500;
let y = new Number(500);

Nhưng khi sử dụng toán tử ===, x và y không bằng nhau.

let x = 500;
let y = new Number(500);

Lưu ý sự khác biệt giữa (x == y) và (x === y).

(x == y) là true hay false?

let x = new Number(500);
let y = new Number(500);
(x === y) là true hay false?

let x = new Number(500);
let y = new Number(500);

So sánh hai đối tượng JavaScript luôn trả về false.

Việc sử dụng đối tượng Number không phải là phổ biến và thường không được khuyến khích, vì nó có thể gây hiểu lầm và tăng độ phức tạp của mã nguồn. Thay vào đó, nên sử dụng các giá trị số nguyên thủ công khi cần thiết.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories