Lập trình · 26/09/2026

JavaScript parseInt: Đọc được số chưa có nghĩa đầu vào hợp lệ

Một ô số lượng nhận “12abc” nhưng ứng dụng vẫn lưu 12. Nếu dùng parseInt như một bước kiểm tra hợp lệ, bạn có thể chấp nhận dữ liệu mà người dùng không định nhập. Chuyển chuỗi thành số và xác nhận toàn bộ đầu vào hợp lệ là hai việc khác nhau.

JavaScript parseInt: Đọc được số chưa có nghĩa đầu vào hợp lệ

Một ô số lượng nhận “12abc” nhưng ứng dụng vẫn lưu 12. Nếu dùng parseInt như một bước kiểm tra hợp lệ, bạn có thể chấp nhận dữ liệu mà người dùng không định nhập. Chuyển chuỗi thành số và xác nhận toàn bộ đầu vào hợp lệ là hai việc khác nhau.

1. parseInt đọc được phần đầu không có nghĩa cả chuỗi đúng

Tài liệu parseInt của MDN mô tả việc phân tích chuỗi theo cơ số. Hàm có thể dừng ở ký tự không thuộc phần số và trả phần đã đọc.

console.log(parseInt('12abc', 10)); // 12
console.log(parseInt('12.5', 10));  // 12

Đây là kết quả mong đợi, không phải lỗi của JavaScript. Nếu sản phẩm yêu cầu số nguyên không có hậu tố, cần kiểm tra cấu trúc đầu vào trước thay vì dùng việc nhận được một số làm dấu hiệu thành công.

2. Viết rõ hợp đồng cho trường số lượng

Ví dụ sau chấp nhận chuỗi chữ số ASCII, cho phép khoảng trắng ở hai đầu sau khi trim và số 0 ở đầu. Miền giá trị là 0 đến 1000. Nó từ chối dấu cộng, số âm, dấu thập phân và ký hiệu số mũ. Đây là chính sách minh họa cần điều chỉnh theo sản phẩm.

function parseQuantity(raw) {
  if (typeof raw !== 'string') {
    throw new TypeError('Expected text input');
  }
  const text = raw.trim();
  if (!/^[0-9]+$/.test(text)) {
    throw new TypeError('Use decimal digits only');
  }
  const quantity = Number(text);
  if (!Number.isSafeInteger(quantity) || quantity > 1000) {
    throw new RangeError('Quantity must be from 0 to 1000');
  }
  return quantity;
}

Chuỗi rỗng bị từ chối trước bước Number, tránh biến một ô chưa nhập thành số 0. Chuỗi "0012" trở thành 12 theo chính sách đã nêu. Nếu số 0 ở đầu có ý nghĩa, chẳng hạn mã định danh, nên giữ dữ liệu dạng chuỗi thay vì dùng hàm này.

3. Kiểm tra số hữu hạn chưa đủ cho mọi yêu cầu

Number.isFinite kiểm tra một giá trị đã là số hữu hạn và không tự ép chuỗi thành số. Nhưng 12.5 vẫn là số hữu hạn, nên trường số nguyên cần thêm điều kiện tương ứng. Miền nghiệp vụ như tối đa 1000 cũng là kiểm tra riêng.

Đừng thay mọi giá trị lỗi bằng 0 hoặc mặc định. Với ô số lượng, dữ liệu sai nên được báo rõ để người dùng sửa, thay vì âm thầm chuyển thành một lựa chọn có ý nghĩa khác.

4. Cân nhắc định dạng theo ngôn ngữ

Hàm minh họa không đọc “1.000” hoặc “1,000” như một nghìn. Nếu giao diện hỗ trợ dấu phân cách hàng nghìn hay dấu thập phân theo ngôn ngữ, hãy xác định quy tắc riêng và hiển thị ví dụ nhập liệu. Xóa mọi dấu chấm, dấu phẩy mà không biết ngữ cảnh có thể đổi giá trị.

Validation phía trình duyệt giúp phản hồi nhanh nhưng backend vẫn phải kiểm tra kiểu, miền giá trị và quyền thực hiện thao tác. Dữ liệu có thể đến từ client khác ngoài form của bạn.

5. Bộ ca kiểm thử tối thiểu

  • "0", "12", "0012" và " 12 " được xử lý theo chính sách.
  • Chuỗi rỗng, chỉ khoảng trắng và "12abc" bị từ chối.
  • "12.5", "1e3", "-1" và "+1" không được chấp nhận trong ví dụ.
  • "1000" hợp lệ, "1001" vượt giới hạn.
  • null, object và số truyền trực tiếp không bị tự chuyển thành chuỗi.
  • Chuỗi số rất lớn không vượt qua kiểm tra an toàn và giới hạn.

Chọn parser theo định dạng được phép, rồi kiểm tra giá trị sau phân tích. Một con số được trả về chưa chứng minh đầu vào đã đúng ý nghĩa.

Thảo luận

Bình luận 0

Đăng nhập để bình luận

Bạn cần có tài khoản để tham gia thảo luận và trả lời độc giả khác.

Đăng nhậpĐăng ký

Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.