testing一个值是奇数还是偶数
我决定用一个非常简单的algorithm来创build简单的isEven和isOdd函数:
function isEven(n) { n = Number(n); return n === 0 || !!(n && !(n%2)); } function isOdd(n) { return isEven(Number(n) + 1); }
如果n具有某些参数,那么这是可以的,但是对于许多情况来说却失败 所以我着手创build强大的函数,为尽可能多的场景提供正确的结果,这样只有javascript数字范围内的整数才会被testing,其他的都会返回false(包括+和 – infinity)。 请注意,零是偶数。
// 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));
任何人都可以看到上述的任何问题? 有没有更好的(即更准确,更快或更简洁而不被混淆)的版本?
有不同的职位与其他语言,但我似乎无法findECMAScript的权威版本。
编辑
代码审查标签被添加,但我没有经过代码审查。 我简单地发布了代码,以便其他人可以看到我在哪里,而不是作为审查的东西。 迄今为止发布的答案似乎得到了。
编辑2
最后的function,基于史蒂夫的答案:
// Use abstract equality == for "is number" test function isEven(n) { return n == parseFloat(n)? !(n%2) : void 0; } // Use strict equality === for "is number" test function isEvenStrict(n) { return n === parseFloat(n)? !(n%2) : void 0; }
任何不是数字的东西都会返回undefined ,数字会返回true或者false 。 这可能是一个严格的国旗function,但我认为严格的比较是不是真的需要。
使用模数:
function isEven(n) { return n % 2 == 0; } function isOdd(n) { return Math.abs(n % 2) == 1; }
你可以检查在JavaScript中的任何值可以被强制为一个数字:
Number.isFinite(parseFloat(n))
这个检查最好在isEven
和isOdd
函数之外完成,所以你不必在两个函数中重复error handling。
我更喜欢使用一点testing:
if(i & 1) { // ODD } else { // EVEN }
这testing第一个位是否打开表示一个奇数。
以下情况如何? 我只在IE中testing了这个,但是处理表示任意长度的数字的string,实际的整数或浮点数,以及在传递一个布尔型,未定义,空值,数组或对象时返回false都是非常乐意的。 (由您决定是否忽略string传入时的前导空格或尾随空格 – 我假设它们不会被忽略并导致这两个函数返回false。)
function isEven(n) { return /^-?\d*[02468]$/.test(n); } function isOdd(n) { return /^-?\d*[13579]$/.test(n); }
注意: 也有负数。
function isOddInteger(n) { return isInteger(n) && (n % 2 !== 0) ) ; }
哪里
function isInteger(n) { return n === parseInt(n); }
为什么不这样做:
function oddOrEven(num){ if(num % 2 == 0) return "even"; return "odd"; } oddOrEven(num);
var isEven = function(number) { // Your code goes here! if (number % 2 == 0){ return(true); } else{ return(false); } };
史蒂夫·梅恩的简单修改/改进的答案!
function isEvenOrOdd(n){ if(n === parseFloat(n)){ return isNumber(n) && (n % 2 == 0); } return false; }
注意:如果无效,则返回false!
不同的方式:
var isEven = function(number) { // Your code goes here! if (((number/2) - Math.floor(number/2)) === 0) {return true;} else {return false;}; }; isEven(69)
因为为什么不使用string
function isEven(__num){ return String(__num/2).indexOf('.') === -1; }
if (testNum == 0); else if (testNum % 2 == 0); else if ((testNum % 2) != 0 );
要testing你是否有一个奇数或偶数,这也适用。
const comapare = x => integer(checkNumber(x)); function checkNumber (x) { if (x % 2 == 0) { return true; } else if (x % 2 != 0) { return false; } } function integer (x) { if (x) { console.log('even'); } else { console.log('odd'); } }
使用现代JavaScript风格:
const NUMBERS = "nul one two three four five six seven ocho nueve".split(" ") const isOdd = n=> NUMBERS[n % 10].indexOf("e")!=-1 const isEven = n=> isOdd(+n+1)
这一个更简单!
var num = 3 //instead get your value here var aa = ["Even", "Odd"]; alert(aa[num % 2]);