Không. JavaScript là ngôn ngữ kiểu động (dynamically typed) – biến không gắn liền kiểu dữ liệu. Bạn chỉ khai báo tên biến bằng var/let/const, kiểu được xác định bởi giá trị gán vào tại runtime.
So sánh với ngôn ngữ kiểu tĩnh (Static Typing)
| Đặc điểm | C/C++, Java, C# (Static) | JavaScript (Dynamic) |
|---|---|---|
| Khai báo biến | int x;, String s; | let x;, const s = "" |
| Kiểu biến | Cố định (int, String...) | Không có (biến chỉ là tên) |
| Gán giá trị sai kiểu | Compile error | Runtime: tự ép kiểu hoặc đổi kiểu biến |
| Kiểm tra kiểu | Compile-time | Runtime (typeof, instanceof) |
Khai báo biến trong JS
// Chỉ khai báo (giá trị = undefined)
var rank;
let points;
const MAX_LEVEL; // ❌ Lỗi: const bắt buộc khởi tạo
// Khai báo + khởi tạo (gán giá trị)
var name = "Amit";
let rank = 2;
const PI = 3.14159;
// Cùng biến, đổi kiểu giá trị (chỉ var/let)
let value = 100; // number
value = "hello"; // string - OK
value = true; // boolean - OK
value = { a: 1 }; // object - OK
Tại sao không cần kiểu?
- Thiết kế cho scripting nhanh, linh hoạt, prototype-based.
- Giá trị tự mang theo kiểu (self-describing values).
- Engine tối ưu hóa nội bộ (hidden classes, inline caching) dựa trên hình dạng object thực tế.
Khi nào CẦN quan tâm kiểu?
- API boundary (validate input từ user/server).
- Performance critical (tránh hidden class transition).
- Đồng đội/dev lớn – dùng TypeScript hoặc JSDoc.
TypeScript: Thêm kiểu tĩnh cho JS
// TypeScript
let age: number = 20;
let name: string = "Amit";
let isActive: boolean = true;
let user: { name: string; age: number } = { name: "Amit", age: 20 };
// Compile ra JS thuần (không còn kiểu)
let age = 20;
let name = "Amit";
JSDoc: Document kiểu không cần compile
/** @type {number} */
let age = 20;
/** @param {string} name @returns {string} */
function greet(name) { return `Hello ${name}`; }
Tóm tắt
- JS: KHÔNG bắt buộc/khai báo kiểu dữ liệu cho biến.
- Kiểu thuộc về giá trị, không phải biến.
- Dùng
let/const(ES6+) thayvar. - Muốn static typing → TypeScript hoặc JSDoc.