Hai thuật ngữ thường bị nhầm lẫn. Dưới đây là phân biệt rõ ràng:
Dynamically Typed (Kiểu động)
- Kiểu dữ liệu gắn liền với giá trị (value), không phải biến.
- Kiểm tra kiểu tại runtime (thời gian chạy).
- Biến có thể giữ giá trị kiểu khác nhau tại các thời điểm khác nhau.
- Thường có type coercion (ép kiểu ngầm) và type introspection (
typeof,instanceof). - Ví dụ: JavaScript, Python, Ruby, PHP, Perl, Lua, Lisp.
// Python
x = 10 # int
x = "hello" # str - OK
# JavaScript
let x = 10; // number
x = "hello"; // string - OK
Untyped (Không kiểu / Vô kiểu)
- Không có hệ thống kiểu dữ liệu (type system) – hoặc hệ thống kiểu rất yếu/không tồn tại.
- Mọi dữ liệu về bản chất là bit/byte/word – ngôn ngữ không phân biệt integer, float, string, pointer...
- Programmer tự quản lý ý nghĩa bit pattern.
- Ví dụ: Assembly, Machine Code, Forth, BCPL, B.
; Assembly (x86)
MOV EAX, 42 ; 42 có thể là int, char, pointer, instruction...
ADD EAX, 10 ; Chỉ là phép toán bit, không biết "kiểu"
JavaScript: Dynamically Typed, KHÔNG phải Untyped
JavaScript CÓ hệ thống kiểu dữ liệu mạnh tại runtime:
- 7 kiểu primitive + Object types.
- Kiểm tra kiểu khi thực thi phép toán (ném TypeError nếu sai).
- Có
typeof,instanceof,Array.isArray()để introspection. - Có coercion rules rõ ràng (dù phức tạp).
Gọi JS là "untyped" là thông tục (colloquial) do không khai báo kiểu tĩnh như Java/C. Thuật ngữ chính xác: Dynamically Typed.
So sánh 3 nhóm
| Đặc điểm | Statically Typed | Dynamically Typed | Untyped |
|---|---|---|---|
| Kiểm tra kiểu | Compile-time | Runtime | Không có |
| Khai báo kiểu biến | Bắt buộc | Không cần | Không có khái niệm |
| Biến đổi kiểu giá trị | Không (trừ cast) | Được | Mọi thứ là bit |
| An toàn kiểu | Cao (bắt lỗi sớm) | Thấp hơn (lỗi runtime) | Không có |
| Ví dụ | Java, C++, TS, Go, Rust | JS, Python, Ruby, PHP | Assembly, Forth |
TypeScript: Static Typing cho JavaScript
// TypeScript - Static typing
let age: number = 25;
age = "hello"; // ❌ Compile Error: Type 'string' not assignable to 'number'
// Compile thành JS thuần (dynamic)
let age = 25;
age = "hello"; // ✅ Runtime OK
Tóm tắt
- Dynamically Typed = Có kiểu, kiểm tra runtime, biến đổi kiểu được (JS, Python...).
- Untyped = Không có hệ thống kiểu, mọi thứ là bit (Assembly...).
- JavaScript là Dynamically Typed. Gọi là "untyped" là không chính xác về mặt khoa học máy tính.