私は非常に単純なアルゴリズムで単純な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;
}
数値ではないものはすべて未定義を返し、数値はtrueまたはfalseを返します。厳密なフラグを持つ1つの関数になることもありますが、厳密な比較は必ずしも必要ではないと思います。
係数を使う:
function isEven(n) {
return n % 2 == 0;
}
function isOdd(n) {
return Math.abs(n % 2) == 1;
}
あなたはJavascriptのどんな値でも数値に強制変換できることを確認することができます。
Number.isFinite(parseFloat(n))
このチェックはisEven
とisOdd
関数の外側で行うのが望ましいので、両方の関数でエラー処理を重複させる必要はありません。
私は少しテストを使うのを好みます:
if(i & 1)
{
// ODD
}
else
{
// EVEN
}
これは、最初のビットがオンであるかどうかをテストします。これは奇数を意味します。
以下はどうですか?これはIEでしかテストしていませんが、任意の長さの数値、整数または浮動小数点数の実際の数値を表す文字列を処理できてうれしいことでした。 (文字列が渡されたときに先行ブランクまたは後続ブランクを無視するかどうかはあなた次第です。それらはnot無視され、両方の関数がfalseを返すと仮定しました。)
function isEven(n) {
return /^-?\d*[02468]$/.test(n);
}
function isOdd(n) {
return /^-?\d*[13579]$/.test(n);
}
注:負の数もあります
function isOddInteger(n)
{
return isInteger(n) && (n % 2 !== 0);
}
どこで
function isInteger(n)
{
return n === parseInt(n, 10);
}
なぜこれをしないでください。
function oddOrEven(num){
if(num % 2 == 0)
return "even";
return "odd";
}
oddOrEven(num);
Steve Mayneの答えを簡単に修正したものです。
function isEvenOrOdd(n){
if(n === parseFloat(n)){
return isNumber(n) && (n % 2 == 0);
}
return false;
}
注:無効な場合はfalseを返します。
var isEven = function(number) {
// Your code goes here!
if (number % 2 == 0){
return(true);
}
else{
return(false);
}
};
たぶんこれ? if(ourNumber%2!== 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');
}
}
最新の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)
それ以外の方法で文字列を使用する理由
function isEven(__num){
return String(__num/2).indexOf('.') === -1;
}
if (testNum == 0);
else if (testNum % 2 == 0);
else if ((testNum % 2) != 0 );
別の方法:
var isEven = function(number) {
// Your code goes here!
if (((number/2) - Math.floor(number/2)) === 0) {return true;} else {return false;};
};
isEven(69)