Các phương pháp chuyển đổi số trong ES6: Đơn giản hóa quy trình lập trình
JavaScript trước ES6 thường yêu cầu các thao tác phức tạp khi xử lý việc chuyển đổi số, như chuyển đổi giữa các hệ cơ số khác nhau hoặc kiểm tra kiểu dữ liệu. Với sự xuất hiện của ES6 (ECMAScript 2015), nhiều phương pháp mới đã được giới thiệu để đơn giản hóa và tăng cường hiệu quả cho các hoạt động liên quan đến số.
Tại sao cần sử dụng các phương pháp chuyển đổi số trong ES6?
Trước ES6, JavaScript gặp phải một số vấn đề khi xử lý số:
- Thiếu biểu diễn nhị phân và bát phân trực tiếp.
- Cần kết hợp nhiều phương pháp để kiểm tra kiểu dữ liệu (ví dụ:
typeofvàObject.prototype.toString). - Việc kiểm tra giá trị biên trở nên phức tạp.
- Các hàm toàn cục (như
parseInt) không đủ rõ ràng về hành vi.
ES6 đã giải quyết những vấn đề này bằng cách cung cấp các công cụ mạnh mẽ hơn để xử lý số một cách an toàn và hiệu quả hơn.
Biểu diễn nhị phân và bát phân
ES6 đã giới thiệu cách viết trực tiếp các số nhị phân và bát phân, giúp tạo ra các giá trị ở các hệ cơ số khác dễ dàng hơn.
Cú pháp
- Nhị phân: Bắt đầu bằng
0bhoặc0B, sau đó là các chữ số 0 và 1. - Bát phân: Bắt đầu bằng
0ohoặc0O, sau đó là các chữ số từ 0 đến 7.
Ví dụ sử dụng
// Biểu diễn nhị phân
const soNhiPhan = 0b111110111; // Hình thức nhị phân của số 503
console.log(soNhiPhan); // Kết quả: 503
// Biểu diễn bát phân
const soBatPhan = 0o767; // Hình thức bát phân của số 503
console.log(soBatPhan); // Kết quả: 503
Những cách biểu diễn này giúp mã nguồn dễ đọc hơn và loại bỏ nhu cầu sử dụng parseInt với việc chỉ định cơ số.
Phương thức mới của đối tượng Number
ES6 đã bổ sung nhiều phương thức hữu ích cho đối tượng Number, hỗ trợ kiểm tra và chuyển đổi số.
Number.isInteger()
Kiểm tra xem một giá trị có phải là số nguyên hay không mà không thực hiện chuyển đổi kiểu.
console.log(Number.isInteger(5)); // true
console.log(Number.isInteger(5.0)); // true
console.log(Number.isInteger(5.5)); // false
console.log(Number.isInteger("5")); // false (Không chuyển đổi chuỗi)
console.log(Number.isInteger(Infinity)); // false
Number.isNaN()
Kiểm tra xem một giá trị có phải là NaN (Not a Number) hay không, đáng tin cậy hơn so với hàm toàn cục isNaN().
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN("NaN")); // false (Không chuyển đổi chuỗi)
console.log(Number.isNaN(5)); // false
console.log(Number.isNaN(undefined)); // false
Number.EPSILON
Đại diện cho sai số nhỏ nhất giữa 1 và số float lớn hơn 1, dùng để so sánh độ chính xác của số float.
// So sánh hai số float có bằng nhau không
function kiemTraGanDung(a, b) {
return Math.abs(a - b) < Number.EPSILON;
}
console.log(0.1 + 0.2 === 0.3); // false (Vấn đề phổ biến về độ chính xác float)
console.log(kiemTraGanDung(0.1 + 0.2, 0.3)); // true
Tăng cường phương thức của đối tượng Math
ES6 cũng mở rộng đối tượng Math với nhiều tính năng toán học mới.
Math.hypot()
Tính căn bậc hai của tổng bình phương tất cả các tham số, thường dùng để tính cạnh huyền của tam giác vuông hoặc độ dài vector.
// Tính cạnh huyền của tam giác vuông 3-4-5
console.log(Math.hypot(3, 4)); // 5
// Tính khoảng cách giữa hai điểm trong không gian 3 chiều
const x = 1, y = 2, z = 3;
console.log(Math.hypot(x, y, z)); // Khoảng ~3.7417
Math.imul()
Thực hiện phép nhân số nguyên 32-bit và trả về kết quả 32-bit, hữu ích khi xử lý tràn bộ nhớ thấp.
// Nhân hai số lớn và lấy kết quả 32-bit
console.log(Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2)); // 2
Phương thức này đặc biệt hữu ích trong xử lý bit và tính toán đồ họa.
Tình huống ứng dụng thực tế
Tình huống 1: Xác thực dữ liệu
Sử dụng các phương thức ES6 để kiểm tra đầu vào của người dùng:
function kiemTraDauVao(input) {
if (Number.isNaN(input)) {
return "Vui lòng nhập số hợp lệ";
}
if (!Number.isInteger(input)) {
return "Vui lòng nhập số nguyên";
}
return "Dữ liệu hợp lệ";
}
Tình huống 2: Tính toán chính xác
Sử dụng Number.EPSILON để xử lý việc so sánh số float:
// So sánh chính xác trong tính toán tài chính
function congTien(a, b) {
return kiemTraGanDung(a + b, Math.round((a + b) * 100) / 100)
? Math.round((a + b) * 100) / 100
: a + b;
}
Tình huống 3: Công cụ chuyển đổi cơ số
Kết hợp nhiều phương pháp để tạo công cụ tiện ích:
// Chuyển đổi số thập phân sang các hệ cơ số khác
function chuyenDoiCoSo(soThapPhan) {
if (!Number.isInteger(soThapPhan) || soThapPhan < 0) {
return "Vui lòng nhập số nguyên không âm";
}
return {
thapPhan: soThapPhan,
nhiPhan: `0b${soThapPhan.toString(2)}`,
batPhan: `0o${soThapPhan.toString(8)}`,
thapLucPhan: `0x${soThapPhan.toString(16).toUpperCase()}`
};
}
console.log(chuyenDoiCoSo(503));
// Kết quả: { thapPhan: 503, nhiPhan: "0b111110111", batPhan: "0o767", thapLucPhan: "0x1F7" }