Eu decidi criar simples eIgual e ISODD função com um algoritmo muito simples:
function isEven(n) {
n = Number(n);
return n === 0 || !!(n && !(n%2));
}
function isOdd(n) {
return isEven(Number(n) + 1);
}
Tudo bem se n estiver com determinados parâmetros, mas falhar em muitos cenários. Então, decidi criar funções robustas que entregam resultados corretos para o maior número possível de cenários, para que apenas números inteiros dentro dos limites dos números javascript sejam testados, todo o resto retorne falso (incluindo + e - infinito). Observe que zero é 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));
Alguém pode ver algum problema com o exposto acima? Existe uma versão melhor (ou seja, mais precisa, mais rápida ou mais concisa sem ser ofuscada)?
Existem várias postagens relacionadas a outros idiomas, mas não consigo encontrar uma versão definitiva para o ECMAScript.
javascript
numbers
RobG
fonte
fonte
Respostas:
Usar módulo:
Você pode verificar se qualquer valor em Javascript pode ser coagido para um número com:
Essa verificação deve ser feita preferencialmente fora das funções
isEven
eisOdd
, para que você não precise duplicar o tratamento de erros nas duas funções.fonte
value
não é um número, ou mesmo se for um número. Ex .:0.1%2
,NaN%2
,[]%2
, etc. O que você escreveu na resposta, ele já sabe disso.0.1
eNaN
funcione bem com a função acima. Array vazio é um pouco de dor, uma vez que equivale a 0 ...return n == parseInt(n);
parareturn n === parseInt(n);
?n % 2 !== 0
ao procurar números ímpares, porque não é necessariamente 1, dependendo do idioma. EDIT: Ah, é para isso que.abs
serve. Deixa pra lá então.Eu prefiro usar um pouco de teste:
Isso testa se o primeiro bit está no qual significa um número ímpar.
fonte
i & 1 == 1 ? console.log("odd") : console.log("even");
Além disso, uma eficiência de nível de bits (não tão amplamente utilizado em JS)Que tal o seguinte? Eu só testei isso no IE, mas fiquei muito feliz ao lidar com cadeias de caracteres que representam números de qualquer tamanho, números reais que eram números inteiros ou flutuantes e as duas funções retornaram false quando passadas por um booleano, indefinido, nulo, uma matriz ou um objeto. (Você decide ignorar os espaços em branco à esquerda ou à direita quando uma string é passada - presumi que eles não sejam ignorados e façam com que ambas as funções retornem falsas.)
fonte
Nota: também existem números negativos.
Onde
fonte
Por que não fazer isso:
fonte
function isEven(num) { return num % 2 == 0
}const oddOrEven = num => num % 2 === 0 ? 'even' : 'odd'
Para concluir o teste de bits de Robert Brisita.
fonte
fonte
if ( <expression> ) return true else return false
paradigma sempre pode ser simplificado parareturn ( <expression> )
(já que a expressão em umif
já é sempre booleana).Uma simples modificação / melhoria da resposta de Steve Mayne!
Nota: Retorna false se inválido!
fonte
Só precisamos de uma linha de código para isso!
Aqui está uma maneira mais nova e alternativa de fazer isso, usando a nova sintaxe ES6 para funções JS e a sintaxe de uma linha da
if-else
chamada de instrução:fonte
let isEven = num => num % 2 === 0
. :-) Mas realmente não é diferente de muitas outras respostas aqui.Um pouco
fonte
Maneira diferente:
fonte
Caso contrário, usando seqüências de caracteres, porque por que não
fonte
fonte
Talvez isto? if (ourNumber% 2! == 0)
fonte
fonte
fonte
Para testar se você tem ou não um número par ou ímpar, isso também funciona.
fonte
Usando o estilo javascript moderno:
fonte
isOdd('5'))
retorna verdadeiro.isEven('5')
também retorna verdadeiro.isOdd(NaN)
gera um erro. :-(isEven('5')
.isOdd(NaN)
provavelmente deve lançar um erro.Este é mais simples!
fonte
num = -1
quando 0 / até queria, mas
O que outras pessoas estão dizendo
fonte
return parseInt(n)%2===0?true:parseInt(n)===0
. mas, novamente, isso é o mesmo que muitas das outras respostas já aqui.return parseInt(n)%2 === 0 || parseInt(n) === 0
. Mas por que analisar ? Isso retorna verdadeiro para valores como "32foo" e12.5
, que não são pares.fonte