Проверка того, является ли значение нечетным или даже

Я решил создать простую функцию 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 (включая + и - бесконечность). Обратите внимание, что ноль является четным.

// 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.

Ответ 1

Использовать модуль:

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

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

Вы можете проверить, что любое значение в Javascript можно принуждать к числу с помощью:

Number.isFinite(parseFloat(n))

Эта проверка предпочтительно должна выполняться вне функций isEven и isOdd, поэтому вам не нужно дублировать обработку ошибок в обеих функциях.

Ответ 2

Я предпочитаю использовать бит-тест:

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

Это проверяет, является ли первый бит, на котором означает нечетное число.

Ответ 3

Как насчет следующего? Я тестировал это только в IE, но был очень рад обрабатывать строки, представляющие числа любой длины, действительные числа, которые были целыми числами или плавающими, а обе функции возвращали false при передаче логических, undefined, null, массива или объекта, (До вас, хотите ли вы игнорировать ведущие или конечные пробелы при передаче строки - я предположил, что они не игнорируются и заставляют обе функции возвращать false.)

function isEven(n) {
   return /^-?\d*[02468]$/.test(n);
}

function isOdd(n) {
   return /^-?\d*[13579]$/.test(n);
}

Ответ 4

Примечание: есть и отрицательные числа.

function isOddInteger(n)
{
   return isInteger(n) && (n % 2 !== 0);
}

где

function isInteger(n)
{
   return n === parseInt(n, 10);
}

Ответ 5

Почему бы просто не сделать это:

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

Ответ 6

Для завершения теста Роберта Брисита.

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

Ответ 7

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

Ответ 8

Простая модификация/улучшение ответа Стива Майна!

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

Примечание. Возвращает false, если это неверно!

Ответ 9

Нам просто нужна одна строка кода для этого!

Вот более новый и альтернативный способ сделать это, используя новый синтаксис ES6 для функций JS и однострочный синтаксис для вызова оператора if-else:

const isEven = num => ((num % 2) == 0) ? true : false;

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

Ответ 10

По-другому:

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

isEven(69)

Ответ 11

В противном случае используйте строки, потому что почему не

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

Ответ 12

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

Ответ 13

Чтобы проверить, есть ли у вас нечетное или четное число, это также работает.

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');
    }
}

Ответ 14

Использование современного стиля 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)

Ответ 15

Может быть, это? if (ourNumber% 2! == 0)

Ответ 16

Простой способ проверить, использует ли число даже JavaScript

function isEven(x) {
//return true if even
if (x % 2 === 0) {
    return true;
}
//return false otherwise
else {
    return false
}
}
// or much simpler
function isEven(x) {
return x % 2 === 0;
}

Ответ 17

Это проще!

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

  alert(aa[num % 2]);

Ответ 18

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

Ответ 19

if (i % 2) {
return odd numbers
}

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