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

Khác biệt giữa Untyped và Dynamically Typed Programming Languages

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ểmStatically TypedDynamically TypedUntyped
Kiểm tra kiểuCompile-timeRuntimeKhông có
Khai báo kiểu biếnBắt buộcKhông cầnKhông có khái niệm
Biến đổi kiểu giá trịKhông (trừ cast)ĐượcMọi thứ là bit
An toàn kiểuCao (bắt lỗi sớm)Thấp hơn (lỗi runtime)Không có
Ví dụJava, C++, TS, Go, RustJS, Python, Ruby, PHPAssembly, 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.