Decidí crear funciones simples isEven e isOdd con un algoritmo muy simple:
function isEven(n) {
n = Number(n);
return n === 0 || !!(n && !(n%2));
}
function isOdd(n) {
return isEven(Number(n) + 1);
}
Eso está bien si n está con ciertos parámetros, pero falla en muchos escenarios. Así que me propuse crear funciones robustas que brinden resultados correctos para tantos escenarios como pueda, de modo que solo se prueben los enteros dentro de los límites de los números de JavaScript, todo lo demás devuelve falso (incluido + e - infinito). Tenga en cuenta que cero es par.
// 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));
¿Alguien puede ver algún problema con lo anterior? ¿Existe una versión mejor (es decir, más precisa, más rápida o más concisa sin ofuscarse)?
Hay varias publicaciones relacionadas con otros idiomas, pero parece que no puedo encontrar una versión definitiva para ECMAScript.
javascript
numbers
RobG
fuente
fuente
Respuestas:
Usar módulo:
Puede verificar que cualquier valor en Javascript se puede convertir a un número con:
Esta verificación debe realizarse preferiblemente fuera de las funciones
isEven
yisOdd
, para que no tenga que duplicar el manejo de errores en ambas funciones.fuente
value
no es un número, o incluso si es un número. Ej .:0.1%2
,NaN%2
,[]%2
, etc. Lo que escribió en la respuesta, ya lo sabe.0.1
yNaN
funciona bien con la función anterior. La matriz vacía es un poco molesta ya que equivale a 0 ...return n == parseInt(n);
areturn n === parseInt(n);
?n % 2 !== 0
al verificar números impares, porque no es necesariamente 1, dependiendo del idioma. EDITAR: Ah, para eso está la.abs
llamada. Olvidalo entonces.Prefiero usar una prueba de bit:
Esto prueba si el primer bit está activado, lo que significa un número impar.
fuente
i & 1 == 1 ? console.log("odd") : console.log("even");
Además, +1 para la eficiencia del nivel de bits (no tan utilizado en JS)¿Qué tal lo siguiente? Solo probé esto en IE, pero estaba muy contento de manejar cadenas que representan números de cualquier longitud, números reales que eran enteros o flotantes, y ambas funciones devuelven falso cuando se pasa un booleano, indefinido, nulo, una matriz o un objeto. (Depende de usted si desea ignorar los espacios en blanco iniciales o finales cuando se pasa una cadena; he asumido que no se ignoran y hacen que ambas funciones devuelvan falso).
fuente
Nota: también hay números negativos.
dónde
fuente
¿Por qué no solo hacer esto?
fuente
function isEven(num) { return num % 2 == 0
}const oddOrEven = num => num % 2 === 0 ? 'even' : 'odd'
Para completar la prueba de bits de Robert Brisita.
fuente
fuente
if ( <expression> ) return true else return false
paradigma siempre se puede simplificar areturn ( <expression> )
(ya que la expresión en unif
ya es siempre booleana).¡Una simple modificación / mejora de la respuesta de Steve Mayne!
Nota: ¡Devuelve falso si no es válido!
fuente
¡Solo necesitamos una línea de código para esto!
Aquí hay una forma más nueva y alternativa de hacer esto, utilizando la nueva sintaxis ES6 para las funciones JS y la sintaxis de una línea para la
if-else
llamada a la instrucción:fuente
let isEven = num => num % 2 === 0
. :-) Pero realmente no es diferente a muchas otras respuestas aquí.Unos pocos
fuente
Diferente modo:
fuente
De lo contrario, usar cadenas porque ¿por qué no?
fuente
fuente
¿Tal vez esto? if (ourNumber% 2! == 0)
fuente
fuente
fuente
Para probar si tiene o no un número par o impar, esto también funciona.
fuente
Usando estilo javascript moderno:
fuente
isOdd('5'))
devuelve verdaderoisEven('5')
También devuelve verdadero.isOdd(NaN)
arroja un error :-(isEven('5')
.isOdd(NaN)
Probablemente debería arrojar un error.¡Este es más simple!
fuente
num = -1
cuando 0 / incluso quería pero
fuente
return parseInt(n)%2===0?true:parseInt(n)===0
. pero, de nuevo, esto es lo mismo que muchas de las otras respuestas que ya están aquí.return parseInt(n)%2 === 0 || parseInt(n) === 0
. ¿Pero por qué analizar ? Eso devuelve verdadero para valores como "32foo" y12.5
, que no son pares.fuente