我决定用一个非常简单的算法创建简单的isEven和isOdd函数:

function isEven(n) {
  n = Number(n);
  return n === 0 || !!(n && !(n%2));
}

function isOdd(n) {
  return isEven(Number(n) + 1);
}

如果n带有某些参数,这是可行的,但在许多情况下都行不通。因此,我开始创建健壮的函数,为尽可能多的场景提供正确的结果,以便只测试javascript数字限制内的整数,其他一切返回false(包括+和-∞)。注意,0是偶数。

// 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的权威版本。


使用模量:

function isEven(n) {
   return n % 2 == 0;
}

function isOdd(n) {
   return Math.abs(n % 2) == 1;
}

你可以检查Javascript中的任何值都可以被强制转换为一个数字:

Number.isFinite(parseFloat(n))

这种检查最好在isEven和isOdd函数之外进行,这样就不必在两个函数中重复错误处理。


下面这个怎么样?我只在IE中测试了这个,但它很乐意处理表示任何长度的数字的字符串,实际数字是整数或浮点数,两个函数在传递布尔值时返回false,未定义,null,数组或对象。(当传入一个字符串时,你是否想忽略前导空格或尾随空格由你决定——我假设它们不会被忽略,并导致两个函数都返回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, 10);
}

我更喜欢使用位测试:

if(i & 1)
{
    // ODD
}
else
{
    // EVEN
}

这测试第一个表示奇数的位是否在上。


var isEven = function(number) {
    // Your code goes here!
    if (number % 2 == 0){
       return(true);
    }
    else{
       return(false);    
    }
};

这个更简单!

  var num = 3 //instead get your value here
  var aa = ["Even", "Odd"];

  alert(aa[num % 2]);

不同的方式:

var isEven = function(number) {
  // Your code goes here!
  if (((number/2) - Math.floor(number/2)) === 0) {return true;} else {return false;};
};

isEven(69)

一个简单的修改/改进史蒂夫梅恩的答案!

function isEvenOrOdd(n){
    if(n === parseFloat(n)){
        return isNumber(n) && (n % 2 == 0);
    }
    return false;
}

注意:无效返回false !


否则就用字符串,为什么不呢

function isEven(__num){
    return String(__num/2).indexOf('.') === -1;
}

if (testNum == 0);
else if (testNum % 2  == 0);
else if ((testNum % 2) != 0 );

为什么不这样做呢:

    function oddOrEven(num){
        if(num % 2 == 0)
            return "even";
        return "odd";
    }
    oddOrEven(num);

为了测试你得到的是奇数还是偶数,这也可以。

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)

也许这吗? if(ourNumber % 2 !== 0)


我们只需要一行代码!

这里有一种更新的替代方法,使用新的ES6 JS函数语法,以及if-else语句调用的一行语法:

const isEven = num => ((num % 2) == 0);

alert(isEven(8));  //true
alert(isEven(9));  //false
alert(isEven(-8)); //true

function isEven(n) {return parseInt(n)%2===0?true:parseInt(n)===0?true:false}

当0/甚至想要但是

isEven(0) //true
isEven(1) //false
isEven(2) //true
isEven(142856) //true
isEven(142856.142857)//true
isEven(142857.1457)//false


完成Robert Brisita的钻头测试。

if ( ~i & 1 ) {
    // Even
}

if (i % 2) {
return odd numbers
}

if (i % 2 - 1) {
return even numbers
}

var num = someNumber
    isEven;
parseInt(num/2) === num/2 ? isEven = true : isEven = false;

x % 2 == 0; // Check if even

!(x & 1); // bitmask the value with 1 then invert.

((x >> 1) << 1) == x; // divide value by 2 then multiply again and check against original value

~x&1; // flip the bits and bitmask

for(var a=0, a<=20;a++){ if(a%2!==0){ console.log(“奇数”+a); } } for(var b=0; b<=20;a++){ if(b%2===0){ console.log(“偶数”+b); } }


var isOdd = x => Boolean(x % 2);
var isEven = x => !isOdd(x);

检查某行代码中number是否为偶数:

var iseven=(_)=>_%2==0