我决定用一个非常简单的算法创建简单的 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的最终版本。
添加了代码审核标记,但我不是在进行代码审核之后。我简单地发布了代码,以便其他人可以看到我在哪里,而不是要审查的东西。到目前为止发布的答案似乎得到了。
最终功能,基于史蒂夫的回答:
// 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 。它可能是一个带有严格标志的函数,但我认为不需要进行严格的比较。
答案 0 :(得分:305)
使用模数:
function isEven(n) {
return n % 2 == 0;
}
function isOdd(n) {
return Math.abs(n % 2) == 1;
}
您可以检查Javascript中的任何值是否都可以强制转换为以下数字:
Number.isFinite(parseFloat(n))
此检查最好在isEven
和isOdd
函数之外进行,因此您无需在两个函数中复制错误处理。
答案 1 :(得分:67)
我更喜欢使用位测试:
if(i & 1)
{
// ODD
}
else
{
// EVEN
}
测试第一位是否表示奇数。
答案 2 :(得分:7)
以下怎么样?我只在IE中对此进行了测试,但是很乐意处理表示任意长度数字的字符串,实际数字是整数或浮点数,并且当传递布尔值,未定义,空值,数组或对象时,这两个函数都返回false。 (在传入字符串时,是否要忽略前导或尾随空白 - 我认为它们不被忽略并导致两个函数都返回false。)
function isEven(n) {
return /^-?\d*[02468]$/.test(n);
}
function isOdd(n) {
return /^-?\d*[13579]$/.test(n);
}
答案 3 :(得分:7)
注意:也有负数。
function isOddInteger(n)
{
return isInteger(n) && (n % 2 !== 0);
}
,其中
function isInteger(n)
{
return n === parseInt(n, 10);
}
答案 4 :(得分:4)
为什么不这样做:
function oddOrEven(num){
if(num % 2 == 0)
return "even";
return "odd";
}
oddOrEven(num);
答案 5 :(得分:2)
要完成Robert Brisita的位测试。
if ( ~i & 1 ) {
// Even
}
答案 6 :(得分:1)
var isEven = function(number) {
// Your code goes here!
if (number % 2 == 0){
return(true);
}
else{
return(false);
}
};
答案 7 :(得分:1)
对Steve Mayne的简单修改/改进回答!
function isEvenOrOdd(n){
if(n === parseFloat(n)){
return isNumber(n) && (n % 2 == 0);
}
return false;
}
注意:如果无效,则返回false!
答案 8 :(得分:1)
一些
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
答案 9 :(得分:1)
为此,我们只需要一行代码!
这是一种更新的替代方法,对JS函数使用新的ES6语法,对if-else
语句调用使用one-line syntax:
const isEven = num => ((num % 2) == 0) ? true : false;
alert(isEven(8)); //true
alert(isEven(9)); //false
alert(isEven(-8)); //true
答案 10 :(得分:0)
var isOdd = x => Boolean(x % 2);
var isEven = x => !isOdd(x);
答案 11 :(得分:0)
for(var a=0; a<=20;a++){
if(a%2!==0){
console.log("Odd number "+a);
}
}
for(var b=0; b<=20;a++){
if(b%2===0){
console.log("Even number "+b);
}
}
答案 12 :(得分:0)
var num = someNumber
isEven;
parseInt(num/2) === num/2 ? isEven = true : isEven = false;
答案 13 :(得分:0)
也许这个? if(ourNumber%2!== 0)
答案 14 :(得分:0)
使用现代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 :(得分:0)
为了测试你是否有奇数或偶数,这也有效。
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');
}
}
答案 16 :(得分:0)
if (testNum == 0);
else if (testNum % 2 == 0);
else if ((testNum % 2) != 0 );
答案 17 :(得分:0)
另外使用字符串,因为为什么不
function isEven(__num){
return String(__num/2).indexOf('.') === -1;
}
答案 18 :(得分:0)
不同的方式:
var isEven = function(number) {
// Your code goes here!
if (((number/2) - Math.floor(number/2)) === 0) {return true;} else {return false;};
};
isEven(69)
答案 19 :(得分:-1)
使用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;
}
答案 20 :(得分:-2)
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
答案 21 :(得分:-2)
if (i % 2) {
return odd numbers
}
if (i % 2 - 1) {
return even numbers
}
答案 22 :(得分:-2)
这个更简单!
var num = 3 //instead get your value here
var aa = ["Even", "Odd"];
alert(aa[num % 2]);