Tôi quyết định tạo hàm isEven và isOdd đơn giản với thuật toán rất đơn giản:
function isEven(n) {
n = Number(n);
return n === 0 || !!(n && !(n%2));
}
function isOdd(n) {
return isEven(Number(n) + 1);
}
Điều đó là ổn nếu n với một số tham số nhất định, nhưng thất bại trong nhiều tình huống. Vì vậy, tôi đã đặt ra để tạo ra các hàm mạnh mẽ mang lại kết quả chính xác cho nhiều kịch bản nhất có thể, để chỉ các số nguyên trong giới hạn của số javascript được kiểm tra, mọi thứ khác đều trả về sai (bao gồm cả + và - vô cùng). Lưu ý rằng số 0 là chẵn.
// Returns true if:
//
// n is an integer that is evenly divisible by 2
//
// Zero (+/-0) is even
// Returns false if n is not an integer, not even or NaN
// Guard against empty string
(function (global) {
function basicTests(n) {
// Deal with empty string
if (n === '')
return false;
// Convert n to Number (may set to NaN)
n = Number(n);
// Deal with NaN
if (isNaN(n))
return false;
// Deal with infinity -
if (n === Number.NEGATIVE_INFINITY || n === Number.POSITIVE_INFINITY)
return false;
// Return n as a number
return n;
}
function isEven(n) {
// Do basic tests
if (basicTests(n) === false)
return false;
// Convert to Number and proceed
n = Number(n);
// Return true/false
return n === 0 || !!(n && !(n%2));
}
global.isEven = isEven;
// Returns true if n is an integer and (n+1) is even
// Returns false if n is not an integer or (n+1) is not even
// Empty string evaluates to zero so returns false (zero is even)
function isOdd(n) {
// Do basic tests
if (basicTests(n) === false)
return false;
// Return true/false
return n === 0 || !!(n && (n%2));
}
global.isOdd = isOdd;
}(this));
Bất cứ ai có thể nhìn thấy bất kỳ vấn đề với ở trên? Có phiên bản nào tốt hơn (tức là chính xác hơn, nhanh hơn hoặc ngắn gọn hơn mà không bị xáo trộn) không?
Có nhiều bài viết liên quan đến các ngôn ngữ khác, nhưng dường như tôi không thể tìm thấy phiên bản dứt khoát cho ECMAScript.