JavaScript thường được gọi là "untyped" (không kiểu) hoặc "dynamically typed" (kiểu động). Cả 2 thuật ngữ đều chỉ bản chất: biến không gắn liền kiểu dữ liệu, kiểu thuộc về giá trị (value).
Untyped vs Dynamically Typed
| Thuật ngữ | Ý nghĩa | Ví dụ ngôn ngữ |
|---|---|---|
| Untyped | Không có hệ thống kiểu tĩnh; biến không khai báo kiểu; runtime không ép kiểu tự động (thường). | Assembly, Forth, BCPL, JavaScript (thông dụng) |
| Dynamically Typed | Kiểu gắn với giá trị (không phải biến), kiểm tra kiểu tại runtime, có ép kiểu/coercion. | JavaScript, Python, Ruby, PHP, Perl, Lua |
| Statically Typed | Kiểu gắn với biến, kiểm tra tại compile-time. | C, C++, Java, C#, TypeScript, Go, Rust |
Thực tế: JavaScript là dynamically typed (kiểu động) – có hệ thống kiểu mạnh tại runtime, có coercion (ép kiểu ngầm). "Untyped" là gọi thông tục vì không khai báo kiểu.
Đặc điểm kiểu động trong JS
let x = 42; // x là number
x = "hello"; // x giờ là string - OK
x = true; // x giờ là boolean - OK
x = { a: 1 }; // x giờ là object - OK
x = [1, 2, 3]; // x giờ là array - OK
x = () => {}; // x giờ là function - OK
Khai báo biến: Chỉ cần var/let/const
// Không cần kiểu: int, string, bool...
var age = 20;
let name = "An";
const PI = 3.14;
// Cùng tên, đổi kiểu thoải mái (var/let)
let value = 100;
value = "Một trăm";
value = false;
Ví dụ từ bài gốc
<script>
var age = 20;
if (age > 18) {
document.write("<b>Đủ điều kiện lái xe</b>");
}
</script>
Ép kiểu ngầm (Type Coercion) - Đặc thù JS
"5" + 3; // "53" (string concatenation)
"5" - 3; // 2 (number subtraction)
"5" * "2"; // 10 (number multiplication)
true + true; // 2 (true → 1)
null + 1; // 1 (null → 0)
undefined + 1; // NaN
[] + []; // "" (empty string)
[] + {}; // "[object Object]"
Kiểm tra kiểu tại Runtime
typeof 42; // "number"
typeof "hello"; // "string"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof Symbol(); // "symbol"
typeof 123n; // "bigint"
typeof null; // "object" (bug)
typeof {}; // "object"
typeof []; // "object"
typeof function(){}; // "function"
Array.isArray([]); // true
value instanceof Array; // true
TypeScript: Static Typing cho JS
Nếu muốn kiểu tĩnh (static typing) – dùng TypeScript (superset của JS):
let age: number = 20;
age = "hello"; // Compile error: Type 'string' not assignable to 'number'
function greet(name: string): string {
return `Hello, ${name}!`;
}
Tóm tắt
- JS = Dynamically typed (kiểu động) – kiểu gắn với giá trị, kiểm tra runtime.
- Không khai báo kiểu cho biến – dùng
var/let/const. - Có coercion (ép kiểu ngầm) – vừa linh hoạt vừa dễ bug.
- Dùng
typeof,instanceof,Array.isArray()để kiểm tra kiểu runtime. - Muốn static typing → TypeScript.