Mỗi giá trị trong JavaScript thuộc một kiểu: là số, là chữ, là đúng/sai, hay là "không có gì". Biết kiểu thì mới biết giá trị đó làm được gì. Cộng hai số ra số, còn cộng hai chuỗi thì ra chuỗi nối.
number: số
JS chỉ có một kiểu số cho cả số nguyên lẫn số thập phân. Không có int và float riêng như C#.
const hp = 100;
const moveSpeed = 5.5;
const damage = -20;
console.log(hp + damage); // 80
Chi tiết về làm tròn, chuyển chuỗi thành số, số ngẫu nhiên có ở trang Số.
string: chuỗi
Chuỗi là chữ, bọc trong nháy kép "...", nháy đơn '...' hoặc dấu backtick `...`.
const playerName = "Aki";
const className = 'Pháp sư';
const greeting = `Chào ${playerName}`;
console.log(greeting); // Chào Aki
Số viết trong nháy là chuỗi, không phải số. Chỗ này hay gây lỗi:
console.log(10 + 5); // 15
console.log("10" + 5); // 105
Dấu + gặp chuỗi thì nối chuỗi. Xem thêm ở trang Chuỗi.
boolean: đúng hoặc sai
Boolean chỉ có hai giá trị: true và false. Dùng cho các trạng thái có/không.
const isAlive = true;
const hasKey = false;
console.log(100 > 50); // true
Phép so sánh luôn trả về boolean. Đây là thứ mà if else dùng để rẽ nhánh.
undefined và null
Hai giá trị này đều nghĩa là "không có gì", nhưng khác nhau ở chỗ ai làm ra nó.
undefined: JS tự gán khi một biến chưa được cho giá trị, hoặc khi đọc thuộc tính không tồn tại.null: bạn tự gán để nói rõ "chỗ này cố ý để trống".
let currentTarget;
console.log(currentTarget); // undefined
const player = { name: "Aki" };
console.log(player.weapon); // undefined
let equippedShield = null; // chưa trang bị khiên, cố ý để trống
Quy ước dễ nhớ: đừng tự gán undefined. Khi muốn nói "trống", dùng null.
Lỗi hay gặp: đọc thuộc tính của một giá trị đang là
undefinedhoặcnull. Ví dụcurrentTarget.hpkhi chưa chọn mục tiêu sẽ báoTypeError: Cannot read properties of undefined (reading 'hp'). Kiểm tra biến có giá trị chưa trước khi đọc bên trong nó.
Kiểm tra kiểu với typeof
typeof trả về tên kiểu dưới dạng chuỗi.
console.log(typeof 100); // number
console.log(typeof "Aki"); // string
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
console.log(typeof null); // object
Dòng cuối không phải lỗi đánh máy. typeof null ra "object" là một lỗi từ phiên bản JS đầu tiên, giữ lại tới giờ để không làm hỏng web cũ. Muốn kiểm tra null thì so sánh thẳng:
let target = null;
console.log(target === null); // true
typeof có ích khi dữ liệu đến từ ngoài vào, ví dụ đọc từ file hay từ ô nhập liệu, và bạn cần chắc nó là số trước khi tính.
const input = "50";
if (typeof input === "string") {
console.log("Cần đổi sang số trước khi cộng");
}
Một biến có thể đổi kiểu
Biến trong JS không bị khoá kiểu. Cùng một biến let có thể giữ số rồi giữ chuỗi.
let reward = 100;
reward = "Kiếm lửa";
console.log(typeof reward); // string
JS cho phép, nhưng đừng làm vậy. Một biến lúc là số lúc là chữ thì đoạn code phía sau không biết đang nhận gì. Đây chính là vấn đề mà TypeScript sinh ra để chặn.
Bài tập
Đoán kết quả của từng dòng trước khi chạy thử.
console.log(typeof 3.14);
console.log(typeof "3.14");
console.log("7" + 3);
console.log(typeof null);
let shield;
console.log(shield);
Xem đáp án
console.log(typeof 3.14); // number
console.log(typeof "3.14"); // string
console.log("7" + 3); // 73
console.log(typeof null); // object
let shield;
console.log(shield); // undefined