Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

JavaScript là ngôn ngữ không kiểu (Untyped) hay kiểu động (Dynamically Typed)?

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ĩaVí dụ ngôn ngữ
UntypedKhô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 TypedKiể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 TypedKiể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.