วิธีการตรวจสอบว่าเป็นเลขคี่ใน JavaScript


245

ใครช่วยชี้ให้ฉันดูรหัสเพื่อตรวจสอบว่าตัวเลขใน JavaScript เป็นเลขคู่หรือคี่



1
@ DavidThomas ฉันเห็นด้วยบางส่วน แต่ฉันมีข้อแม้สองข้อ: 1. ถ้าฉันต้องเลือกฉันอยากจะเป็นโปรแกรมเมอร์มือใหม่ที่รู้เรื่องตัว%ดำเนินการมากกว่า&และ 2 ในขณะที่&เร็วกว่าในทางทฤษฎีมันไม่สำคัญเลย
kojiro

3
@kojiro: ฉันจะเสนอทางเลือกให้กับผู้เรียนมากกว่า (ถูกต้อง); รวมทั้งฉันไม่เคยคิดที่จะใช้ bitwise- & ในลักษณะนี้มาก่อนดังนั้นจึงเป็นเรื่องที่น่าสนใจ อย่างไรก็ตามเนื่องจากมันเป็นล่อคู่กันฉันจึงตั้งค่าสถานะเพื่อรวมกับคำถามที่มีอยู่ก่อนหน้า หวังว่าคำตอบที่นี่ (อย่างน้อยคำตอบนั้น) จะไม่สูญหาย
เดวิดบอกว่าคืนสถานะโมนิก้า

1
@kojiro ฉันกลัวที่จะพูดว่าซอของคุณไม่มีประโยชน์เลยเนื่องจากการคำนวณส่วนใหญ่ถูกใช้โดยการเรียกฟังก์ชัน แต่ไม่มีใครจะใช้ฟังก์ชั่นการโทรเพื่อตรวจสอบว่าเป็นเลขคี่หรือแม้กระทั่ง ... ฉันทำการแก้ไขครั้งที่สามของการทดสอบของคุณ แต่ตอนนี้ฉันอยู่ในโทรศัพท์ของฉัน ...
MaxArt

1
มีความเป็นไปได้ที่ซ้ำกันของการทดสอบว่าค่าเป็นเลขคี่หรือคู่
bummi

คำตอบ:


347

ใช้รหัสด้านล่าง:

function isOdd(num) { return num % 2;}
console.log("1 is " + isOdd(1));
console.log("2 is " + isOdd(2));
console.log("3 is " + isOdd(3));
console.log("4 is " + isOdd(4));

1 หมายถึงเลขคี่ในขณะที่ 0 หมายถึงเลขคู่


97
โปรดทราบว่าสิ่งนี้จะส่งคืน0หรือ1(หรือNaNถ้าคุณป้อนสิ่งที่ไม่ใช่ตัวเลขและไม่สามารถรวมเข้าด้วยกันได้) ซึ่งจะใช้ได้ดีกับสถานการณ์ส่วนใหญ่ แต่ถ้าคุณต้องการตัวจริงtrueหรือfalse:return (num % 2) == 1;
TJ Crowder

3
ใช่ทราบดีเกี่ยวกับน่าน แต่โดยปกติแล้วคุณต้องการให้ javascript เป็นจริงหรือเป็นเท็จซึ่งเป็นเหตุผลว่าทำไมฉันถึงเขียนแบบที่ฉันทำ
Chii

9
เพียงเพื่อชี้แจงผู้ประกอบการโมดูโล่ (%) ให้ส่วนที่เหลือของการแบ่ง ดังนั้น 3% 2 จะเท่ากับ 3/2 โดยเหลือ 1 เป็นส่วนที่เหลือดังนั้น 3% 2 จะกลับมาเป็น 1
Abuh

6
นอกจากสิ่งที่ TJ พูดแล้วสิ่งนี้จะส่งกลับเศษส่วนหากnumไม่ใช่จำนวนเต็ม ซึ่งจะยังคงใช้งานได้หากคุณเปรียบเทียบisOdd(1.5)==true(เพราะค่าเศษส่วนไม่เท่ากับtrue) แต่จะดีกว่าหากฟังก์ชันส่งคืนtrueหรือfalseตามนัยโดยชื่อ "isOdd"
nnnnnn

6
คุณยังสามารถทำได้return !!(num % 2)เพื่อรับบูลีน
Duncan

115

ใช้ตัวANDดำเนินการระดับบิต

function oddOrEven(x) {
  return ( x & 1 ) ? "odd" : "even";
}

function checkNumber(argNumber) {
  document.getElementById("result").innerHTML = "Number " + argNumber + " is " + oddOrEven(argNumber);
}
 
checkNumber(17);
<div id="result" style="font-size:150%;text-shadow: 1px 1px 2px #CE5937;" ></div>

หากคุณไม่ต้องการค่าส่งคืนสตริง แต่เป็นค่าบูลีนให้ใช้สิ่งนี้:

var isOdd = function(x) { return x & 1; };
var isEven  = function(x) { return !( x & 1 ); };

5
+1, คุณตอบถูกกว่าฉันไม่ต้องพูดถึงว่าคุณมีคำตอบเดียวที่ไม่ได้ใช้X % Y!
s0d4pop

4
ฉันไม่แน่ใจว่าการทดสอบของฉันนั้นถูกต้องหรือไม่ แต่ bitwise และดูเหมือนว่าจะช้ากว่าตัวควบคุมโมดูโล 40 เท่าสำหรับหมายเลขที่กำหนดและช้าลง 2 เท่าสำหรับหมายเลขสุ่ม: jsperf.com/odd-or-even
Blender

8
โปรดทราบว่าสิ่งนี้จะส่งกลับ "คี่" หรือ "คู่" สำหรับตัวเลขที่ไม่ใช่ (เช่น 3.14)
nnnnnn

2
หรือ: function isEven(n){return !(n & 1);}.
RobG

7
@Gnuey ทุกหมายเลขประกอบด้วยชุดของบิต หมายเลขคี่ทั้งหมดมีบิตที่มีนัยสำคัญน้อยที่สุด (ขวาสุด) ตั้งค่าเป็น 1, เลขคู่ทั้งหมด 0 การx & 1ตรวจสอบว่าบิตสุดท้ายถูกตั้งค่าเป็นตัวเลขหรือไม่ (เพราะ 1 เป็นตัวเลขที่มีบิตทั้งหมดตั้งค่าเป็น 1 ยกเว้นบิตนัยสำคัญน้อยที่สุด ): ถ้าเป็นเช่นนั้นตัวเลขจะเป็นเลขคี่
0x499602D2

31

คุณสามารถทำสิ่งนี้:

function isEven(value){
    if (value%2 == 0)
        return true;
    else
        return false;
}

9
ดูเหมือนคุณจะไม่รู้ว่าบูลีนคืออะไร เป็นเพียงรุ่นที่ใช้คำฟุ่มเฟือยไม่มีความจำเป็นของif (condition) { answer=true; } else { answer=false; } answer = (bool) condition;ลดฟังก์ชั่นของคุณfunction isEven(value) { return (bool) (value%2 == 0); }และเราทุกคนจะมีความสุข
awm

9
ไม่จำเป็นต้องได้รับการต่อว่าต่อขานเพราะฉันเขียนโปรแกรมที่แตกต่าง
TNC

5
@awm - ดูเหมือนว่าคุณไม่รู้จัก JavaScript คุณไม่สามารถส่งการบูลีนด้วย(bool)(ซึ่งจะทำให้เกิดข้อผิดพลาด) และในกรณีใด ๆ ที่คุณไม่จำเป็นต้อง: return value%2 == 0;จะทำงานเนื่องจาก==ผู้ประกอบการส่งกลับบูลีน
nnnnnn

2
ว้าวฉันเขียนจริงเหรอ? ใช่มันผิดอย่างชัดเจน answer = !!(condition)ควรจะเป็นสิ่งที่ชอบ ประเด็นที่ฉันพยายามทำก็คือคุณสามารถreturn value%2==0ทำได้และไม่จำเป็นต้องกังวลกับเงื่อนไข
awm

ฉันคิดว่ามันสวยงาม: value%2===0
carlodurso


13

ฉันต้องทำให้อาร์เรย์มีขนาดใหญ่จริง ๆ ที่มีจำนวนคู่มาก

ไม่ใช้โมดูลัส (%) มันให้ส่วนที่เหลือของตัวเลขสองจำนวนที่คุณหาร

Ex. 2 % 2 = 0 because 2/2 = 1 with 0 remainder.

Ex2. 3 % 2 = 1 because 3/2 = 1 with 1 remainder.

Ex3. -7 % 2 = -1 because -7/2 = -3 with -1 remainder.

ซึ่งหมายความว่าถ้าคุณแก้ไขหมายเลข x 2 คุณจะได้รับ 0 หรือ 1 หรือ -1 0 จะหมายความว่ามันเป็นเลขคู่ สิ่งอื่นใดก็หมายความว่ามันแปลก


8

สิ่งนี้สามารถแก้ไขได้ด้วยโค้ดขนาดเล็ก:

function isEven(value) {
    if (value%2 == 0)
    return true;
else
    return false;
}

หวังว่าจะช่วย :)


6

เช่นเดียวกับหลายภาษา Javascript มีตัวดำเนินการโมดูลัส%ซึ่งค้นหาส่วนที่เหลือ หากไม่มีเหลือหลังจากการหารด้วย 2 ตัวเลขจะเท่ากับ:

// this expression is true if "number" is even, false otherwise
(number % 2 == 0)

นี่เป็นสำนวนที่ใช้กันทั่วไปมากสำหรับการทดสอบเลขจำนวนเต็มคู่


3
อย่างไรก็ตามโมดูลัสอาจเป็นเรื่องยาก / ไม่ได้กำหนดสำหรับค่าลบ .. โปรดศึกษาข้อกำหนดภาษาที่เหมาะสม


5

ฟังก์ชั่นง่าย ๆ ที่คุณสามารถผ่านได้ ใช้โอเปอเรเตอร์แบบโมดูโล%:

var is_even = function(x) {
    return !(x % 2); 
}

is_even(3)
false
is_even(6)
true

1
หากผลลัพธ์ของคุณในผู้ประกอบการที่เป็นทั้งสามเป็น 'จริง' หรือ 'เท็จ' คุณไม่จำเป็นต้องมีผู้ประกอบการที่ประกอบไปด้วย ที่นี่คุณสามารถทำได้ / ควรทำ:return !(x % 2);
dom_watson

4

ใช้ส่วนขยายของฉัน:

Number.prototype.isEven=function(){
     return this % 2===0;
};

Number.prototype.isOdd=function(){
     return !this.isEven();
}

แล้วก็

var a=5; 
 a.isEven();

== เท็จ

 a.isOdd();

== ทรู

หากคุณไม่แน่ใจว่าเป็นตัวเลขหรือไม่ให้ทดสอบโดยการแยกสาขาต่อไปนี้

if(a.isOdd){
    a.isOdd();
}

อัปเดต:

หากคุณจะไม่ใช้ตัวแปร:

(5).isOdd()

ประสิทธิภาพ :

ปรากฎว่ากระบวนทัศน์กระบวนทัศน์ดีกว่ากระบวนทัศน์ OOP โดยวิธีการที่ฉันทำ โปรไฟล์ใน FIDDLEนี้ อย่างไรก็ตามวิธี OOP ยังสวยที่สุด

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณเพื่อนสำหรับตรรกะนี้ในผู้ให้สัมภาษณ์บางคนถามตรรกะชนิดนี้ไม่สามารถตอบได้ตอนนี้ฉันเข้าใจแล้วขอบคุณ .. แต่มีประโยชน์ในการปฏิบัติงานโดยทำตามวิธีนี้หรือไม่? เราสามารถเขียน isEven (x); ฯลฯ
Shoib Mohammed A

@ShoibMohammedA: เสร็จสิ้นการเปรียบเทียบ! jsfiddle.net/abdennour/jL2uyksa/3
Abdennour TOUMI

-1 ไม่ขยายฟังก์ชันต้นแบบดั้งเดิม ( stackoverflow.com/questions/14034180/… )
tfmontague

3

ลบ 2 ถึงมันวนซ้ำจนกว่าจะถึง -1 หรือ 0 (ใช้ได้กับจำนวนเต็มบวกเท่านั้น) :)


ด้วยตัวเลขติดลบคุณแทนที่จะเพิ่มเป็น 2
Hydroper

และต้องใช้เวลาสักพักหนึ่งเมื่อ n = 2 ^ 52 และจำนวนอนันต์สำหรับ n> 2 ^ 53
rioV8

3

คุณสามารถใช้คำสั่ง for และเงื่อนไขเพื่อพิจารณาว่าตัวเลขหรือชุดของตัวเลขเป็นเลขคี่หรือไม่:

for (var i=1; i<=5; i++) 
if (i%2 !== 0) {
    console.log(i)
}

สิ่งนี้จะพิมพ์ทุกเลขคี่ระหว่าง 1 ถึง 5


3

เพิ่งดำเนินการหนึ่งใน Adobe Dreamweaver .. มันทำงานได้อย่างสมบูรณ์ ฉันใช้ถ้า (isNaN (mynmb))

เพื่อตรวจสอบว่าค่าที่กำหนดเป็นตัวเลขหรือไม่และฉันยังใช้ Math.abs (mynmb% 2)เพื่อแปลงจำนวนลบให้เป็นค่าบวกและคำนวณ

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

</head>
<body bgcolor = "#FFFFCC">
    <h3 align ="center"> ODD OR EVEN </h3><table cellspacing = "2" cellpadding = "5" bgcolor="palegreen">
        <form name = formtwo>
            <td align = "center">
                <center><BR />Enter a number: 
                    <input type=text id="enter" name=enter maxlength="10" />
                    <input type=button name = b3 value = "Click Here" onClick = compute() />
                      <b>is<b> 
                <input type=text id="outtxt" name=output size="5" value="" disabled /> </b></b></center><b><b>
                <BR /><BR />
            </b></b></td></form>
        </table>

    <script type='text/javascript'>

        function compute()
        {
          var enter = document.getElementById("enter");
          var outtxt = document.getElementById("outtxt");

          var mynmb = enter.value;
          if (isNaN(mynmb)) 
          { 
            outtxt.value = "error !!!"; 
            alert( 'please enter a valid number');
            enter.focus();
            return;
          }
          else 
          { 
             if ( mynmb%2 == 0 ) { outtxt.value = "Even"; }  
             if ( Math.abs(mynmb%2) == 1 ) { outtxt.value = "Odd"; }
          }
        }

    </script>
</body>
</html>

3
   <script>
        function even_odd(){
            var num =   document.getElementById('number').value;

            if ( num % 2){
                document.getElementById('result').innerHTML = "Entered Number is Odd";
            }
            else{
                document.getElementById('result').innerHTML = "Entered Number is Even";
            }
        }
    </script>
</head>
<body>
    <center>
        <div id="error"></div>
        <center>
            <h2> Find Given Number is Even or Odd </h2>
            <p>Enter a value</p>
            <input type="text" id="number" />
            <button onclick="even_odd();">Check</button><br />
            <div id="result"><b></b></div>
        </center>
    </center>
</body>

2
if (X % 2 === 0){
} else {
}

แทนที่ X ด้วยหมายเลขของคุณ (อาจมาจากตัวแปร) คำสั่ง If ทำงานเมื่อตัวเลขเป็นเลขคู่ Else เมื่อเป็นเลขคี่

ถ้าคุณแค่อยากรู้ว่าตัวเลขที่ให้มาเป็นเลขคี่หรือไม่:

if (X % 2 !== 0){
}

อีกครั้งแทนที่ X ด้วยตัวเลขหรือตัวแปร


2

ทุกเลขคี่เมื่อหารด้วยสองใบที่เหลือเป็น 1 และทุกเลขคู่เมื่อหารด้วยศูนย์จะทำให้ใบเหลือเป็นศูนย์ ดังนั้นเราสามารถใช้รหัสนี้

  function checker(number)  {
   return number%2==0?even:odd;
   }


2

นี่คือสิ่งที่ฉันทำ

//Array of numbers
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,32,23,643,67,5876,6345,34,3453];
//Array of even numbers
var evenNumbers = [];
//Array of odd numbers
var oddNumbers = [];

function classifyNumbers(arr){
  //go through the numbers one by one
  for(var i=0; i<=arr.length-1; i++){
     if (arr[i] % 2 == 0 ){
        //Push the number to the evenNumbers array
        evenNumbers.push(arr[i]);
     } else {
        //Push the number to the oddNumbers array
        oddNumbers.push(arr[i]);
     }
  }
}

classifyNumbers(numbers);

console.log('Even numbers: ' + evenNumbers);
console.log('Odd numbers: ' + oddNumbers);

ด้วยเหตุผลบางอย่างฉันต้องแน่ใจว่าความยาวของอาเรย์นั้นน้อยลง เมื่อฉันไม่ทำเช่นนั้นฉันจะได้รับ "undefined" ในองค์ประกอบสุดท้ายของอาร์เรย์คี่ตัวเลข


2
มันเป็นเพราะเงื่อนไขถูกตั้งค่าเป็นน้อยกว่าหรือเท่ากับ "<=" ตามความยาวของอาร์เรย์ ฉันลบเครื่องหมายเท่ากับและผลลัพธ์เป็นไปตามที่ต้องการ
Zakher Masri

2

เมื่อคุณต้องการทดสอบว่าตัวแปรบางตัวเป็นค่าคี่แรกคุณควรทดสอบว่าเป็นจำนวนเต็มหรือไม่ นอกจากนี้โปรดสังเกตว่าเมื่อคุณคำนวณส่วนที่เหลือเป็นจำนวนลบผลลัพธ์จะเป็นค่าลบ ( -3 % 2 === -1)

function isOdd(value) {
  return typeof value === "number" && // value should be a number
    isFinite(value) &&                // value should be finite
    Math.floor(value) === value &&    // value should be integer
    value % 2 !== 0;                  // value should not be even
}

หาก Number.isInteger พร้อมใช้งานคุณอาจลดความซับซ้อนของรหัสนี้เป็น:

function isOdd(value) {
  return Number.isInteger(value)      // value should be integer
    value % 2 !== 0;                  // value should not be even
}

หมายเหตุ: ที่นี่เราทดสอบvalue % 2 !== 0แทนที่จะเป็นเพราะvalue % 2 === 1 -3 % 2 === -1หากคุณไม่ต้องการ-1ผ่านการทดสอบนี้คุณอาจต้องเปลี่ยนบรรทัดนี้

นี่คือกรณีทดสอบบางส่วน:

isOdd();         // false
isOdd("string"); // false
isOdd(Infinity); // false
isOdd(NaN);      // false
isOdd(0);        // false
isOdd(1.1);      // false
isOdd("1");      // false
isOdd(1);        // true
isOdd(-1);       // true

2

การใช้%จะช่วยให้คุณทำสิ่งนี้ ...

คุณสามารถสร้างฟังก์ชั่นสองอย่างเพื่อทำเพื่อคุณ ... ฉันชอบฟังก์ชั่น separte ที่ไม่ได้แนบกับ Number ใน Javascript เช่นนี้ซึ่งตรวจสอบว่าคุณผ่านหมายเลขหรือไม่:

ฟังก์ชั่นแปลก:

var isOdd = function(num) {
  return 'number'!==typeof num ? 'NaN' : !!(num % 2);
};

ฟังก์ชั่นแม้กระทั่ง:

var isEven = function(num) {
  return isOdd(num)==='NaN' ? isOdd(num) : !isOdd(num);
};

และเรียกมันว่าสิ่งนี้:

isOdd(5); // true
isOdd(6); // false
isOdd(12); // false
isOdd(18); // false
isEven(18); // true
isEven('18'); // 'NaN'
isEven('17'); // 'NaN'
isOdd(null); // 'NaN'
isEven('100'); // true


2

หลายคนเข้าใจผิดความหมายของคี่

  • isOdd("str")ควรเป็นเท็จ
    เฉพาะจำนวนเต็มเท่านั้นที่สามารถเป็นเลขคี่
  • isOdd(1.223)และisOdd(-1.223)ควรเป็นเท็จ
    การลอยไม่ใช่จำนวนเต็ม
  • isOdd(0)ควรเป็นเท็จ
    Zero เป็นจำนวนเต็มคู่ ( https://en.wikipedia.org/wiki/Parity_of_zero )
  • isOdd(-1)ควรเป็นจริง
    มันเป็นจำนวนเต็มคี่

สารละลาย

function isOdd(n) {

  // Must be a number
  if (isNaN(n)) {
    return false;
  }

  // Number must not be a float
  if ((n % 1) !== 0) {
    return false;
  }

  // Integer must not be equal to zero
  if (n === 0) {
    return false;
  }

  // Integer must be odd
  if ((n % 2) !== 0) {
    return true;
  }

  return false;
}

JS Fiddle (หากจำเป็น): https://jsfiddle.net/9dzdv593/8/

1 ซับ

โซลูชัน Javascript 1 ซับ สำหรับผู้ที่ไม่สนใจการอ่าน

const isOdd = n => !(isNaN(n) && ((n % 1) !== 0) && (n === 0)) && ((n % 2) !== 0) ? true : false;

คุณสามารถเร่งแก้ปัญหาได้ นั่นคือในประโยคสุดท้ายที่คุณสามารถส่งคืนได้ !! (n% 2) สิ่งนี้จะทำให้มันทำงานกับตัวเลขที่มีการเซ็นชื่อ (เช่นเมื่อ n% 2 ส่งกลับ 0 มันเป็นเท็จ แต่เมื่อ -1 หรือ 1 กลับมานี่จะ ผลตอบแทนจริง) วิธีการแก้ปัญหาของคุณคืนค่าเท็จสำหรับตัวเลขคี่เนื่องจากตรวจสอบว่าโมดูลัสคืนเป็น 0 แต่ควรตรวจสอบ 1 และ 1 จะล้มเหลวสำหรับจำนวนลบดังนั้นส่งคืน !! (n% 2) ปลอดภัยกว่า และยังไงก็ตาม {} (คำสั่งบล็อก) ไม่ได้ทำให้เกิดปัญหาการลดขนาดและไม่ได้อยู่ในการสนทนา
Hydroper

@TheProHands - ขอบคุณสำหรับบันทึก (1) ปัญหาคือว่า Modulus Version มีการพิมพ์ผิด; มันควรจะได้รับแทน(n % 2) !== 0 (n % 2) === 0(2) คำแนะนำของฉันคือการหลีกเลี่ยง!!(n % 2)เพราะ (a) มันมีประสิทธิภาพช้ากว่า(n % 2) !== 0( jsperf.com/notnot-vs-strict-not ) (b) มันแฮ็ค - มันรวมค่าความเท็จ0เข้าไว้falseและ (c) มันคลุมเครือ (ภาษาการเขียนโปรแกรมระดับสูงไม่ควรอ่านเหมือนกับ Pascal เพราะประสิทธิภาพ - นั่นเป็นหน้าที่ของคอมไพเลอร์) (3) ใช่{}คำสั่งบล็อกที่หายไปจะส่งผลให้เกิดปัญหาหลายประการ (ตามที่ได้รับการปรับปรุงในคำตอบของฉัน)
tfmontague

ฉันไม่เคยหลีกเลี่ยงคำสั่งบล็อกเพราะฉันสนใจการอ่าน แต่ฉันพยายามที่จะบอกว่าการค้นหาคำสั่งบล็อกไม่ได้ส่งผลให้เกิดปัญหาเฉพาะในการบำรุงรักษารหัส นั่นคือการใช้ลำดับนิพจน์ที่ผสานกับคำสั่ง expression แทนที่จะเป็นคำสั่ง block อาจทำให้โค้ดอ่านไม่ได้และน่าเกลียดเช่น: if (0) call1(), assign = 0, call2()แต่คำสั่งเดียวไม่เลว: if (0) return; if (0) ;; if (0); break; if (0) continue;และยังไงก็ตามฉันชอบใช้คำสั่ง break-line block ต่อไปเมื่อฉัน เงื่อนไขระยะยาวแบบอินไลน์
Hydroper

การตรวจสอบการพิมพ์ / null เช่นคุณisNaN(n)โง่ - แน่ใจว่าคุณครอบคลุมNaNกรณี แต่isOdd(null), isOdd(undefined), isOdd({x:1})ผลตอบแทนทั้งหมดfalseซึ่งผมคิดว่าจะเป็นข้อผิดพลาด; นอกเสียจากว่าคุณจะระบุเพียงว่าฟังก์ชั่นของคุณมีพฤติกรรมที่ถูกต้องในโดเมนที่กำหนด: เฉพาะอินพุตประเภทตัวเลข ในกรณีนี้ให้ทำisNaNเครื่องหมายในช่องนั้นและบังคับให้ผู้ใช้โทรหามันด้วยประเภทที่ถูกต้อง การเขียนโปรแกรมการป้องกันเป็นอย่างยิ่งใหญ่ จากนั้นฟังก์ชั่นของคุณจะถูกทำให้ง่ายขึ้นisOdd = x => Math.floor(x) === x && x & 1 === 1- ส่งคืนค่าที่ชัดเจนtrueหรือfalseไม่จำเป็นต้องมีค่า
ขอบคุณ

null, undefinedและวัตถุ{}ไม่ได้เลขคี่และดังนั้นจึงกลับมาทำงานfalse- ไม่แน่ใจว่าทำไมคุณพิจารณาว่ามีข้อผิดพลาด การisNaNตรวจสอบสำหรับประสิทธิภาพ (ไม่ใช่เพื่อการป้องกัน) มันช่วยให้ฟังก์ชั่นออกก่อนกำหนดโดยไม่ต้องทำการตรวจสอบอื่น ๆ
tfmontague

1

ฉันจะใช้สิ่งนี้เพื่อส่งคืนบูลีน:

function isOdd (n) {
    return !!(n % 2);
    // or ((n % 2) !== 0).
}

มันจะทำงานกับทั้งหมายเลขที่ไม่ได้ลงนามและลงนาม เมื่อกลับมาโมดูลัส-1หรือว่ามันจะได้รับการแปลเป็น1true

วิธีการแก้ปัญหาที่ไม่ใช่โมดูลัส:

var is_finite = isFinite;
var is_nan = isNaN;

function isOdd (discriminant) {
    if (is_nan(discriminant) && !is_finite(discriminant)) {
        return false;
    }

    // Unsigned numbers
    if (discriminant >= 0) {
        while (discriminant >= 1) discriminant -= 2;

    // Signed numbers
    } else {
        if (discriminant === -1) return true;
        while (discriminant <= -1) discriminant += 2;
    }

    return !!discriminant;
}

1

วิธีการทำงานที่มากขึ้นในจาวาสคริปต์ที่ทันสมัย:

const NUMBERS = "nul one two three four five six seven ocho nueve".split(" ")

const negate = f=> (...args)=> !f(...args)
const isOdd  = n=> NUMBERS[n % 10].indexOf("e")!=-1
const isEven = negate(isOdd)

1

ใน ES6:

const isOdd = num => num % 2 == 1;


3
เมื่อเพิ่มคำตอบให้กับคำถามอายุแปดขวบที่มี 26 คำตอบที่มีอยู่จริง ๆ แล้วมันมีประโยชน์มากที่จะอธิบายว่าแง่มุมใหม่ของคำถามคืออะไรที่อยู่คำตอบของคุณและถ้ากาลเวลาและเวอร์ชันใหม่ส่งผลต่อคำตอบ คำตอบโค้ดสามารถปรับปรุงได้เกือบทุกครั้งโดยการเพิ่มคำอธิบายบางอย่างและในกรณีนี้บางตัวอย่างการโทรแสดงการใช้งาน
Jason Aller

1
ชื่อคือ 'วิธีการตรวจสอบว่าตัวเลขเป็นเลขคี่ใน JavaScript' หรือไม่และไม่มีการแก้ไขปัญหา ES6 สำหรับสิ่งที่ถูกถาม
Darryl Mendonez


0

ใช้งานได้กับอาร์เรย์:

function evenOrOdd(numbers) {
  const evenNumbers = [];
  const oddNumbers = [];
  numbers.forEach(number => {
    if (number % 2 === 0) {
      evenNumbers.push(number);
    } else {
      oddNumbers.push(number);
    }
  });

  console.log("Even: " + evenNumbers + "\nOdd: " + oddNumbers);
}

evenOrOdd([1, 4, 9, 21, 41, 92]);

สิ่งนี้ควรออกจากระบบ: 4,92 1,9,21,41

เพียงตัวเลข:

function evenOrOdd(number) {
  if (number % 2 === 0) {
    return "even";
  }

  return "odd";
}

console.log(evenOrOdd(4));

สิ่งนี้ควรจะได้ผลลัพธ์แม้แต่คอนโซล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.