Một service nhận số lượng đã được parser đọc từ JSON. Trường quantity đôi khi là chuỗi, đôi khi là null. Nếu dùng isFinite toàn cục để kiểm tra, cả chuỗi số lẫn một số giá trị rỗng có thể được chấp nhận do JavaScript chuyển kiểu. Điều đó làm điều kiện kiểm tra khác với hợp đồng số mà service dự kiến.
Ví dụ và cách đọc
Đặt hai lựa chọn cạnh nhau trên cùng sáu giá trị. Number.isFinite chỉ chấp nhận number hữu hạn. Hàm toàn cục chuyển kiểu trước khi kiểm tra. Chạy fixture trên Node 24.18.1 để xem khác biệt về kiểu đầu vào và giá trị biên, không dùng kết quả để so tốc độ.
const assert = require('node:assert/strict');
const inputs = [12, '12', '', null, Infinity, NaN];
assert.deepEqual(inputs.map(Number.isFinite), [true, false, false, false, false, false]);
assert.deepEqual(inputs.map(isFinite), [true, true, true, true, false, false]);
Kiểm tra kết quả
Các assertion cho thấy chuỗi 12, chuỗi rỗng và null có kết quả khác giữa hai lựa chọn. Khi hợp đồng API yêu cầu JSON number, Number.isFinite diễn đạt sát mục tiêu và giúp phát hiện sai kiểu ở đầu vào. Khi đọc từ ô nhập vốn là chuỗi, hãy xử lý trường hợp rỗng trước, chuyển đổi theo quy tắc của form rồi mới kiểm tra số hữu hạn.
Áp dụng và giới hạn
Một giá trị hữu hạn vẫn có thể âm, có phần lẻ hoặc nằm ngoài khoảng cho phép. Thêm điều kiện nghiệp vụ riêng, chẳng hạn số nguyên trong khoảng được giao diện mô tả. Fixture không kiểm tra kiểu object đặc biệt hoặc BigInt. Đối với hàm toàn cục, chuyển kiểu có thể ném lỗi với một số kiểu ngoài ví dụ. Chọn phép kiểm tra theo hợp đồng và giữ test cho chính dữ liệu ở ranh giới API.
Tình huống áp dụng
Một test API nên gửi cả JSON number và JSON string với cùng chữ số. Nếu trường được định nghĩa là number, test mong đợi request dùng chuỗi bị từ chối với thông báo rõ kiểu dữ liệu. Ở một form chấp nhận chuỗi, test tương ứng có thể mong đợi chuỗi hợp lệ được chuyển thành number trước khi gửi. Hai test bảo vệ hai hợp đồng khác nhau dù người dùng nhìn thấy cùng số trên màn hình.
Đừng lấy kết quả true làm lý do giữ nguyên giá trị gốc để cộng. Giá trị đã qua isFinite toàn cục có thể vẫn là chuỗi, nên phép cộng phía sau có thể nối chuỗi. Đặt tên biến riêng cho dữ liệu đã chuyển, rồi dùng biến đó xuyên suốt bước tính toán và lưu trữ. Khi đánh giá lựa chọn trong review, ưu tiên câu hỏi dữ liệu đến từ đâu và cần mang kiểu gì ở dòng sử dụng tiếp theo.


