Postanowiłem stworzyć proste funkcje isEven i isOdd z bardzo prostym algorytmem:
function isEven(n) {
n = Number(n);
return n === 0 || !!(n && !(n%2));
}
function isOdd(n) {
return isEven(Number(n) + 1);
}
To jest OK, jeśli n ma określone parametry, ale w wielu scenariuszach kończy się niepowodzeniem. Postanowiłem więc stworzyć solidne funkcje, które dostarczają poprawne wyniki dla tak wielu scenariuszy, jak tylko mogłem, tak aby testowane były tylko liczby całkowite w granicach liczb javascript, a wszystko inne zwraca fałsz (w tym + i - nieskończoność). Zauważ, że zero jest parzyste.
// 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));
Czy ktoś widzi jakieś problemy z powyższym? Czy istnieje lepsza (tj. Dokładniejsza, szybsza lub bardziej zwięzła bez zaciemniania) wersja?
Istnieje wiele postów dotyczących innych języków, ale nie mogę znaleźć ostatecznej wersji ECMAScript.
javascript
numbers
RobG
źródło
źródło
Odpowiedzi:
Użyj modułu:
Możesz sprawdzić, czy dowolna wartość w JavaScript może zostać przekształcona w liczbę za pomocą:
Najlepiej, aby to sprawdzenie było wykonywane poza funkcjami
isEven
iisOdd
, aby nie trzeba było powtarzać obsługi błędów w obu funkcjach.źródło
value
nie jest liczbą lub nawet jeśli jest liczbą. Np .:0.1%2
,NaN%2
,[]%2
, itd. To, co napisałem w odpowiedzi, on już wie.0.1
iNaN
działa dobrze z powyższą funkcją. Pusta tablica jest trochę uciążliwa, ponieważ równa się 0 ...return n == parseInt(n);
nareturn n === parseInt(n);
?n % 2 !== 0
sprawdzając liczby nieparzyste, ponieważ niekoniecznie jest to 1, w zależności od języka. EDYCJA: Ach, po to jest.abs
wezwanie. Nieważne więc.Wolę używać testu bitowego:
To sprawdza, czy pierwszy bit oznacza liczbę nieparzystą.
źródło
i & 1 == 1 ? console.log("odd") : console.log("even");
Również +1 za wydajność poziomu bitów (nie tak szeroko stosowane w JS)A co z następującymi? Testowałem to tylko w IE, ale z przyjemnością radziłem sobie z ciągami reprezentującymi liczby dowolnej długości, rzeczywistymi liczbami, które były liczbami całkowitymi lub zmiennoprzecinkowymi, a obie funkcje zwracały fałsz po przekazaniu wartości logicznej, niezdefiniowanej, null, tablicy lub obiektu. (Od Ciebie zależy, czy chcesz ignorować początkowe lub końcowe spacje, gdy przekazywany jest ciąg - założyłem, że nie są one ignorowane i powodują, że obie funkcje zwracają fałsz).
źródło
Uwaga: istnieją również liczby ujemne.
gdzie
źródło
Dlaczego po prostu tego nie zrobić:
źródło
function isEven(num) { return num % 2 == 0
}const oddOrEven = num => num % 2 === 0 ? 'even' : 'odd'
Aby ukończyć bit test Roberta Brisity.
źródło
źródło
if ( <expression> ) return true else return false
Paradygmat może zawsze być uproszczonereturn ( <expression> )
(od ekspresji wif
już jest zawsze jedna logiczna).Prosta modyfikacja / ulepszenie odpowiedzi Steve Mayne!
Uwaga: zwraca fałsz, jeśli jest nieprawidłowy!
źródło
Potrzebujemy do tego tylko jednej linii kodu!
Tutaj nowsza i alternatywny sposób to zrobić, korzystając z nowego ES6 składnię funkcji JS i składni jednej linii dla
if-else
wywołania instrukcji:źródło
let isEven = num => num % 2 === 0
. :-) Ale tak naprawdę nie różni się od wielu innych odpowiedzi tutaj.Kilka
źródło
Inny sposób:
źródło
W przeciwnym razie używa się ciągów, ponieważ dlaczego nie
źródło
źródło
Może to? if (naszNumer% 2! == 0)
źródło
źródło
źródło
Aby sprawdzić, czy masz liczbę nieparzystą lub parzystą, to również działa.
źródło
Korzystanie z nowoczesnego stylu javascript:
źródło
isOdd('5'))
zwraca prawdę.isEven('5')
również zwraca prawdę.isOdd(NaN)
zgłasza błąd. :-(isEven('5')
.isOdd(NaN)
prawdopodobnie powinien wyrzucić błąd.Ten jest prostszy!
źródło
num = -1
kiedy 0 / nawet chciał ale
Wcześniejsze
źródło
return parseInt(n)%2===0?true:parseInt(n)===0
. ale z drugiej strony jest to to samo, co wiele innych odpowiedzi już tutaj.return parseInt(n)%2 === 0 || parseInt(n) === 0
. Ale dlaczego analizować ? To zwraca prawdę dla wartości takich jak „32foo” i12.5
, które nie są parzyste.źródło