Data Type
Duy Văn | 06/02/2025
Về cơ bản, trong JS có một số kiểu dữ liệu tương tự như Python, tuy nhiên, cách phân loại kiểu dữ liệu thì cụ thể hơn.
Đầu tiên, JS có 8 kiểu dữ liệu cơ bản:
- String - Chuỗi, ví dụ
"Hello World" - Number - Số, ví dụ
123 - BigInt - Số lớn, ví dụ
123456789012345678901234567890123456789n - Boolean - Logic,
TruevàFalse - Undefined - Chưa xác định,
undefined, thường xảy ra khi khai báo biến nhưng không gán giá trị - Null - Rỗng,
null, thường xuất hiện khi một biến không có giá trị gì, khác vớiundefinedở chỗ là biến đã từng được gán giá trị nhưng giờ không còn - Symbol là kiểu dữ liệu mới được thêm vào nhằm mục đích tạo ra các giá trị không trùng lặp, để tạo ra các thuộc tính riêng cho đối tượng, hoặc tạo ra các tên biến riêng biệt. Ví dụ:
let id = Symbol('id') - Object - đối tượng cho JS về cơ bản chính là một dictionary như bên phía Python, nó chứa các cặp key-value, ví dụ
let user = {name: 'Duy', age: 25}. Object ở đây hiểu chính là JS Object
Ngoài ra thì Object cũng là tên một nhóm các kiểu dữ liệu khác, bao gồm cả built-in và tự định nghĩa.
- arrays / intarrays / floatarrays
- dates
- maps
- sets
JS Type là động
JS là ngôn ngữ lập trình có kiểu dữ liệu động, tức là không cần phải khai báo kiểu dữ liệu khi khai báo biến. Đồng thời một biến có thể có các kiểu dữ liệu khác nhau tuỳ theo giá trị gán. Ví dụ:
let a = 123; // Number
a = 'Hello'; // String
a = true; // Boolean
Kiểm tra kiểu dữ liệu
Để kiểm tra kiểu dữ liệu của một biến, ta sử dụng toán tử typeof. Ví dụ:
let a = 123;
console.log(typeof a); // 'number'
typeof là một operator, có thể nhét nó vào trong một logic
let a = 123;
if (typeof a === 'number') {
console.log('a is a number');
}
Dữ liệu được ép kiểu
JS cũng có khái niệm ép kiểu, tức là chuyển đổi giữa các kiểu dữ liệu. Có 2 loại ép kiểu:
- Implicit coercion - Ép kiểu ngầm định, tức là JS tự động chuyển đổi kiểu dữ liệu mà không cần phải khai báo rõ ràng. Ví dụ:
let a = 1 + '2'; // '12'
let b = 1 + 2 + '3'; // '33'
- Explicit coercion - Ép kiểu rõ ràng, tức là chuyển đổi kiểu dữ liệu thông qua các hàm hoặc toán tử. Ví dụ:
let a = '123';
let b = Number(a); // 123
let c = String(123); // '123'
String
Strings về cơ bản là các giá trị text, các giá trị này là các literals và sẽ cần được gán cho biến.
Cụ thể hơn mình viết ở một bài riêng
Number
Số má trong JS được lưu ở dạng số thập phân (floating point) và nó cũng gặp vấn đề về độ chính xác tương tự như Python. Ví dụ:
let a = 0.1 + 0.2;
console.log(a); // 0.30000000000000004
Hay
let a = 0.3;
let b = 0.1 * 3;
console.log(a == b); // false
Số lớn hay rất nhỏ có thể viết ở dạng scientific notation, ví dụ:
let a = 123e5; // 12300000
let b = 123e-5; // 0.00123
Số trong JS được lưu ở dạng double (64bit).
Number có một method là .isInteger() để kiểm tra xem một số có phải là số nguyên hay không và .isSafeInteger() để kiểm tra xem một số có phải là số nguyên an toàn hay không (nằm trong khoảng cho phép)
BigInt
BigInt được tạo ra để lưu các giá trị Integer quá lớn để dùng với Number
Vấn đề của Number là 64-bit floating point, số tự nhiên ở mức râs lớn sẽ bị làm tròn. Ví dụ:
console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992
Số tự nhiên ra khỏi giói hạn +- 9007199254740991 sẽ mất đi độ chính xác. BigInt giải quyết vấn đề này, có thể tạo ra BigInt bằng cách thêm n vào cuối số hoặc dùng hàm BigInt(). Ví dụ:
let a = 9007199254740991n;
let b = BigInt(9007199254740991);
Tất cả mọi tính toán với BigInt sẽ trả ra BigInt, và không thể thực hiện các phép toán giữa BigInt và Number. Ví dụ:
let a = 9007199254740991n;
let b = 2;
console.log(a * b); // Uncaught TypeError
Trừ khi ép về cùng BigInt
let a = 9007199254740991n;
let b = BigInt(2);
console.log(a * b) // 18014398509481982n
Nếu b là số thập phân, thì sẽ lỗi do không thể convert từ float sang BigInt
let a = 9007199254740991n;
let b = BigInt(2.5);
console.log(a * b) // Uncaught RangeError
Boolean
Boolean là kiểu dữ liệu logic, chỉ có 2 giá trị là true và false. Ví dụ:
let a = true;
let b = false;
Ngoài r, các operator logic sẽ trả ra giá trị boolean. Ví dụ:
let a = 1 > 2; // false
let b = 1 < 2; // true
let c = 1 == 2; // false
== là operator so sánh giá trị, còn === là so sánh giá trị và kiểu dữ liệu chặt chẽ hơn
Giống như Python, tất cả cái gì có giá trị nều được coi là True, còn giá trị 0 hoặc rỗng sẽ được coi là False (string rỗng "", undefined, null, 0, NaN)
Cùng với Number, cũng tồn tại một Object tên là Boolean, nhưng cũng không nên sử dụng nó.
Arrays
Arrays trong JS là một kiểu dữ liệu đặc biệt, nó là một object chứa một tập hợp các giá trị, tương tự như list của bên Python.
Cụ thể mình viết ở một bài riêng
Object
Object trong JS chính là một dictionary, nó chứa các cặp key-value. Ví dụ:
let user = {
name: 'Duy',
age: 25
}
Cụ thể hơn mình viết ở bài riêng này
Set
Set là một kiểu dữ liệu mới được thêm vào trong ES6, nó chứa một tập hợp các giá trị không trùng lặp. Ví dụ:
let set = new Set();
set.add(1);
set.add(2);
console.log(set); // Set {1, 2}
Xem cụ thể ở đây
Map
Map cũng là một kiểu dữ liệu mới được thêm vào trong ES6, nó chứa một tập hợp các cặp key-value, tương tự như Object. Tuy nhiên, Map có cú pháp khác, đồng thời key của nó có thể là bất kỳ kiểu dữ liệu nào. Ví dụ:
let map = new Map();
map.set('name', 'Duy');
Ngoài ra nó còn giữ được thứ tự của các cặp key-value. Xem cụ thể ở đây