Ich habe beschlossen, einfache isEven- und isOdd- Funktionen mit einem sehr einfachen Algorithmus zu erstellen :
function isEven(n) {
n = Number(n);
return n === 0 || !!(n && !(n%2));
}
function isOdd(n) {
return isEven(Number(n) + 1);
}
Das ist in Ordnung, wenn n bestimmte Parameter enthält, schlägt jedoch in vielen Szenarien fehl. Deshalb habe ich mich vorgenommen, robuste Funktionen zu erstellen, die für so viele Szenarien wie möglich korrekte Ergebnisse liefern, sodass nur Ganzzahlen innerhalb der Grenzen von Javascript-Zahlen getestet werden und alles andere false zurückgibt (einschließlich + und - unendlich). Beachten Sie, dass Null gerade ist.
// 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));
Kann jemand irgendwelche Probleme mit den oben genannten sehen? Gibt es eine bessere (dh genauere, schnellere oder präzisere Version, ohne verschleiert zu werden) Version?
Es gibt verschiedene Beiträge zu anderen Sprachen, aber ich kann anscheinend keine endgültige Version für ECMAScript finden.
quelle
Antworten:
Modul verwenden:
Sie können überprüfen, ob ein beliebiger Wert in Javascript zu einer Zahl gezwungen werden kann mit:
Diese Überprüfung sollte vorzugsweise außerhalb der Funktionen
isEven
und durchgeführtisOdd
werden, damit Sie die Fehlerbehandlung nicht in beiden Funktionen duplizieren müssen.quelle
value
es sich nicht um eine Nummer handelt oder wenn es sich um eine Nummer handelt. Bsp .:0.1%2
,NaN%2
,[]%2
etc. Was Sie in der Antwort schrieb, er weiß es schon.0.1
undNaN
arbeiten gut mit der obigen Funktion. Leeres Array ist ein bisschen schmerzhaft, da es 0 entspricht ...return n == parseInt(n);
zureturn n === parseInt(n);
?n % 2 !== 0
wenn Sie nach ungeraden Zahlen suchen, da es je nach Sprache nicht unbedingt 1 ist. EDIT: Ah, dafür ist der.abs
Anruf da. Egal Dann.Ich bevorzuge einen kleinen Test:
Dies testet, ob das erste Bit aktiviert ist, das eine ungerade Zahl anzeigt.
quelle
i & 1 == 1 ? console.log("odd") : console.log("even");
Auch +1 für die Effizienz auf Bitebene (in JS nicht so weit verbreitet)Wie wäre es mit folgendem? Ich habe dies nur im IE getestet, aber es war ziemlich glücklich, Zeichenfolgen zu verarbeiten, die Zahlen beliebiger Länge darstellen, tatsächliche Zahlen, die Ganzzahlen oder Gleitkommazahlen sind, und beide Funktionen haben false zurückgegeben, wenn ein Boolescher Wert, ein undefinierter Wert, ein Array oder ein Objekt übergeben wurde. (Es liegt an Ihnen, ob Sie führende oder nachfolgende Leerzeichen ignorieren möchten, wenn eine Zeichenfolge übergeben wird. Ich habe angenommen, dass sie nicht ignoriert werden und beide Funktionen false zurückgeben.)
quelle
Hinweis: Es gibt auch negative Zahlen.
wo
quelle
Warum nicht einfach so machen:
quelle
function isEven(num) { return num % 2 == 0
}const oddOrEven = num => num % 2 === 0 ? 'even' : 'odd'
Um den Bittest von Robert Brisita abzuschließen.
quelle
quelle
if ( <expression> ) return true else return false
Paradigma kann immer vereinfacht werdenreturn ( <expression> )
(da der Ausdruck in einemif
bereits immer ein boolescher ist).Eine einfache Modifikation / Verbesserung der Antwort von Steve Mayne!
Hinweis: Gibt bei Ungültigkeit false zurück!
quelle
Wir brauchen dafür nur eine Codezeile!
Hier eine neuere und alternative Möglichkeit, dies mithilfe der neuen ES6- Syntax für JS-Funktionen und der einzeiligen Syntax für den
if-else
Anweisungsaufruf zu tun :quelle
let isEven = num => num % 2 === 0
. :-) Aber es ist wirklich nicht anders als viele andere Antworten hier.Ein paar
quelle
Anders:
quelle
Ansonsten mit Strings, weil warum nicht
quelle
quelle
Vielleicht das? if (ourNumber% 2! == 0)
quelle
quelle
quelle
Dies funktioniert auch, um zu testen, ob Sie eine ungerade oder eine gerade Zahl haben.
quelle
Verwendung des modernen Javascript-Stils:
quelle
isOdd('5'))
gibt true zurück.isEven('5')
gibt auch true zurück.isOdd(NaN)
wirft einen Fehler. :-(isEven('5')
.isOdd(NaN)
sollte wahrscheinlich einen Fehler auslösen.Dieser ist einfacher!
quelle
num = -1
wenn 0 / wollte aber doch
.
quelle
return parseInt(n)%2===0?true:parseInt(n)===0
. Andererseits ist dies dasselbe wie bei vielen anderen Antworten, die bereits hier vorliegen.return parseInt(n)%2 === 0 || parseInt(n) === 0
. Aber warum parseInt ? Das gibt true für Werte wie "32foo" und zurück12.5
, die nicht gerade sind.quelle