Saya memutuskan untuk membuat sederhana ISEVEN dan ISODD fungsi dengan algoritma yang sangat sederhana:
function isEven(n) {
n = Number(n);
return n === 0 || !!(n && !(n%2));
}
function isOdd(n) {
return isEven(Number(n) + 1);
}
Tidak apa-apa jika n dengan parameter tertentu, tetapi gagal untuk banyak skenario. Jadi saya mulai membuat fungsi yang kuat yang memberikan hasil yang benar untuk sebanyak mungkin skenario, sehingga hanya bilangan bulat dalam batas angka javascript yang diuji, yang lainnya mengembalikan false (termasuk + dan - tak terhingga). Perhatikan bahwa nol adalah genap.
// 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));
Adakah yang bisa melihat masalah dengan hal di atas? Apakah ada versi yang lebih baik (yaitu lebih akurat, lebih cepat atau lebih ringkas tanpa dikaburkan)?
Ada berbagai posting yang berkaitan dengan bahasa lain, tetapi sepertinya saya tidak dapat menemukan versi definitif untuk ECMAScript.
sumber
Jawaban:
Gunakan modulus:
Anda dapat memeriksa bahwa nilai apa pun dalam Javascript dapat dipaksa ke nomor dengan:
Pemeriksaan ini sebaiknya dilakukan di luar fungsi
isEven
danisOdd
, jadi Anda tidak harus menduplikasi penanganan kesalahan di kedua fungsi.sumber
value
bukan angka, atau bahkan jika itu angka. Ex .:0.1%2
,NaN%2
,[]%2
, dll Apa yang Anda tulis dalam jawaban, dia sudah tahu itu.0.1
danNaN
bekerja dengan baik dengan fungsi di atas. Array kosong sedikit menyebalkan karena sama dengan 0 ...return n == parseInt(n);
kereturn n === parseInt(n);
?n % 2 !== 0
ketika memeriksa angka ganjil, karena belum tentu 1, tergantung pada bahasanya. EDIT: Ah, itulah gunanya.abs
panggilan itu. Lupakan saja.Saya lebih suka menggunakan uji bit:
Ini menguji apakah bit pertama adalah yang menandakan angka ganjil.
sumber
i & 1 == 1 ? console.log("odd") : console.log("even");
Juga, +1 untuk efisiensi level bit (tidak banyak digunakan di JS)Bagaimana dengan yang berikut ini? Saya hanya menguji ini di IE, tapi itu cukup senang untuk menangani string yang mewakili angka berapa pun panjangnya, angka aktual yang bilangan bulat atau mengapung, dan kedua fungsi mengembalikan false ketika melewati boolean, undefined, null, array atau objek. (Terserah Anda apakah Anda ingin mengabaikan kekosongan awal atau akhir saat string dilewatkan - Saya berasumsi mereka tidak diabaikan dan menyebabkan kedua fungsi mengembalikan false.)
sumber
Catatan: ada juga angka negatif.
dimana
sumber
Mengapa tidak lakukan saja ini:
sumber
function isEven(num) { return num % 2 == 0
}const oddOrEven = num => num % 2 === 0 ? 'even' : 'odd'
Untuk menyelesaikan tes bit Robert Brisita.
sumber
sumber
if ( <expression> ) return true else return false
paradigma dapat selalu disederhanakanreturn ( <expression> )
(karena ekspresi dalamif
sudah selalu satu boolean).Modifikasi / peningkatan sederhana jawaban Steve Mayne!
Catatan: Mengembalikan nilai false jika tidak valid!
sumber
Kami hanya perlu satu baris kode untuk ini!
Di sini cara yang lebih baru dan alternatif untuk melakukan ini, menggunakan sintaks ES6 baru untuk fungsi JS, dan sintaks satu baris untuk
if-else
panggilan pernyataan:sumber
let isEven = num => num % 2 === 0
. :-) Tapi sebenarnya tidak ada bedanya dengan banyak jawaban lain di sini.Beberapa
sumber
Cara yang berbeda:
sumber
Otherway menggunakan string karena mengapa tidak
sumber
sumber
Mungkin ini? if (ourNumber% 2! == 0)
sumber
sumber
sumber
Untuk menguji apakah Anda memiliki nomor ganjil atau genap, ini juga berfungsi.
sumber
Menggunakan gaya javascript modern:
sumber
isOdd('5'))
mengembalikan true.isEven('5')
juga mengembalikan true.isOdd(NaN)
melempar kesalahan. :-(isEven('5')
.isOdd(NaN)
mungkin harus membuang kesalahan.Yang ini lebih sederhana!
sumber
num = -1
ketika 0 / bahkan ingin tetapi
sumber
return parseInt(n)%2===0?true:parseInt(n)===0
. tetapi sekali lagi, ini sama dengan banyak jawaban lain yang sudah ada di sini.return parseInt(n)%2 === 0 || parseInt(n) === 0
. Tapi mengapa parseInt ? Yang mengembalikan nilai true seperti "32foo" dan12.5
, yang bahkan tidak.sumber