Я решил создать простую функцию 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.
javascript
numbers
RobG
источник
источник
Ответы:
Используйте модуль:
Вы можете проверить, что любое значение в Javascript может быть приведено к числу с помощью:
Эта проверка должна быть предпочтительно сделана вне
isEven
иisOdd
функций, так что вам не придется дублировать обработку ошибок в обеих функциях.источник
value
это не число, или даже если это число. Напр .:0.1%2
,NaN%2
,[]%2
и т.д. То , что вы написали в ответ, он уже знает.0.1
иNaN
нормально работать с функцией выше. Пустой массив - это немного больно, так как он равен 0 ...return n == parseInt(n);
наreturn n === parseInt(n);
?n % 2 !== 0
при проверке нечетных чисел, потому что это не обязательно 1, в зависимости от языка. РЕДАКТИРОВАТЬ: Ах, это то, для чего.abs
призыв. Тогда не важно.Я предпочитаю использовать немного теста:
Это проверяет, включен ли первый бит, который обозначает нечетное число.
источник
i & 1 == 1 ? console.log("odd") : console.log("even");
также +1 для эффективности на уровне битов (не так широко используется в JS)Как насчет следующего? Я проверял это только в IE, но он был очень рад обрабатывать строки, представляющие числа любой длины, действительные числа, которые были целыми числами или числами с плавающей запятой, и обе функции возвращали false, когда передали логическое значение, undefined, null, массив или объект. (До вас, хотите ли вы игнорировать начальные или конечные пробелы при передаче строки - я предположил, что они не игнорируются и заставляют обе функции возвращать false.)
источник
Примечание: есть и отрицательные числа.
где
источник
Почему бы просто не сделать это:
источник
function isEven(num) { return num % 2 == 0
}const oddOrEven = num => num % 2 === 0 ? 'even' : 'odd'
Чтобы завершить битовый тест Роберта Бриситы
источник
источник
if ( <expression> ) return true else return false
Парадигма может всегда быть упрощенаreturn ( <expression> )
(поскольку выражение вif
уже всегда булева один).Простая модификация / улучшение ответа Стива Мейна!
Примечание: возвращает false, если недействительно!
источник
Нам просто нужна одна строка кода для этого!
Вот более новый и альтернативный способ сделать это, используя новый синтаксис ES6 для функций JS и однострочный синтаксис для
if-else
вызова оператора:источник
let isEven = num => num % 2 === 0
. :-) Но на самом деле это не отличается от многих других ответов здесь.Немного
источник
По-другому:
источник
В противном случае использовать строки, потому что почему бы и нет
источник
источник
Может быть, это? if (ourNumber% 2! == 0)
источник
источник
источник
Чтобы проверить, есть ли у вас нечетное или четное число, это также работает.
источник
Используя современный стиль javascript:
источник
isOdd('5'))
возвращает истину.isEven('5')
также возвращает истину.isOdd(NaN)
выдает ошибку. :-(isEven('5')
.isOdd(NaN)
наверное стоит сгенерировать ошибку.Этот более простой!
источник
num = -1
когда 0 / даже хотел но
источник
return parseInt(n)%2===0?true:parseInt(n)===0
. но опять же, это то же самое, что и многие другие ответы уже здесь.return parseInt(n)%2 === 0 || parseInt(n) === 0
. Но почему parseInt ? Это возвращает true для значений типа «32foo» и12.5
, которые не являются четными.источник