ฉันตัดสินใจที่จะสร้างฟังก์ชั่นisEvenและisOddอย่างง่ายด้วยอัลกอริทึมที่ง่ายมาก:
function isEven(n) {
n = Number(n);
return n === 0 || !!(n && !(n%2));
}
function isOdd(n) {
return isEven(Number(n) + 1);
}
นั่นคือตกลงถ้า 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));
ทุกคนสามารถเห็นปัญหาใด ๆ กับข้างต้นหรือไม่ มีรุ่นที่ดีกว่า (เช่นแม่นยำยิ่งขึ้นเร็วขึ้นหรือกระชับมากขึ้นโดยไม่ทำให้งง)?
มีโพสต์ต่างๆที่เกี่ยวข้องกับภาษาอื่น ๆ แต่ฉันไม่สามารถหารุ่นที่ชัดเจนสำหรับ ECMAScript