ละเว้นนิพจน์ที่สองเมื่อใช้ชวเลข if-else


290

ฉันสามารถเขียนif elseชวเลขโดยไม่ต้องelse?

var x=1;

x==2 ? dosomething() : doNothingButContinueCode();   

ฉันสังเกตเห็นว่าการnullทำงานอื่น (แต่ฉันไม่รู้ว่าเพราะอะไรหรือเป็นความคิดที่ดี)

แก้ไข:พวกคุณบางคนรู้สึกงุนงงว่าทำไมฉันถึงต้องลองสิ่งนี้ มั่นใจได้ว่าหมดความอยากรู้ ฉันชอบล้อเล่นกับ JavaScript


ฉันคิดว่ามีvar | varไวยากรณ์ ระวังเพราะอาจเป็น "ยาก" โดยเฉพาะอย่างยิ่ง (IMO) ternaries ที่มีปัญหา ใช้เท่าที่จำเป็น
Jared Farrish

@JaredFarrish ไม่ใช่จุดสำคัญทั้งหมดที่พวกเขาจะ "เห็น" ง่ายกว่าการใช้ if statement ใช่ไหม ไวยากรณ์ที่คุณพูดถึงมันดูน่าสนใจ
Hassan

1
ไม่ฉันไม่คิดว่าพวกเขาจะง่ายกว่าในทุกกรณี "จุดทั้งหมด" ในใจของฉันคือการใส่ไว้ในบรรทัดเดียว ("รหัสของฉันสั้นกว่าของคุณ") หรือสำหรับกรณีที่แท้จริงที่มีผลลัพธ์ง่าย ๆ การสะสมจำนวนมากเป็นอันตรายอย่างยิ่งและควรหลีกเลี่ยงค่าใช้จ่ายทั้งหมด :)
Jared Farrish

1
@ ฮัสซัน - ฉันเห็นบางสิ่งบางอย่างเหมือนfoo = bar | cat;กันที่ไหนถ้าอันแรกผิด? เป็นโมฆะมัน "ผ่าน" ถึงที่สอง ฉันเพิ่งเห็นมันและไม่ได้ใช้
Jared Farrish

3
@ JaredFarrish: นั่นคือa || bหรือa && bมิฉะนั้นbจะได้รับการประเมินเสมอ
kennytm

คำตอบ:


263

นี่คือตัวเลือก:

x==2 && dosomething();

dosomething()จะถูกเรียกใช้เมื่อx==2ประเมินเป็นจริงเท่านั้น สิ่งนี้เรียกว่าการลัดวงจรการลัดวงจร

มันไม่ได้ใช้กันทั่วไปในกรณีเช่นนี้และคุณไม่ควรเขียนโค้ดแบบนี้ ฉันขอแนะนำให้ใช้วิธีที่ง่ายกว่านี้:

if(x==2) dosomething();

คุณควรเขียนโค้ดที่อ่านได้ตลอดเวลา หากคุณกังวลเกี่ยวกับขนาดไฟล์เพียงสร้างเวอร์ชันย่อด้วยความช่วยเหลือของหนึ่งในหลาย ๆ ตัวบีบอัด JS (เช่นคอมไพเลอร์ปิดของ Google )


10
โอ้ลัดวงจรใช่มั้ย การอ่านรหัสอยู่ภายใต้การชื่นชมฉันคิดว่าในนักพัฒนาระดับกลางส่วนใหญ่และ "มืออาชีพที่มีประสบการณ์" บางคน
Jared Farrish

2
ในทางเทคนิคคุณไม่จำเป็นต้องใช้เครื่องมือจัดฟัน: if (1 - 1 === 0) $('.woot').text('Woot!'); ฉันใช้รูปแบบนั้นตลอดเวลากับ PHP และตอนนี้ที่ฉันใช้ Coffeescript ฉันก็ใช้มันใน Javascript ของฉันเช่นกัน
be hollenbeck

5
โดยส่วนตัวผมเชื่อว่ามันจะเล็กถ้ามีผลลัพธ์เดียวถ้าเป็นจริง .. มันเร็วและง่ายกว่าในการเขียน x == 2 && dosomething ();
Dean Meehan

9
if x==2 && doSomething() || doSomethingElse()
Agustín

1
ฉันต้องการรวม JavaScript doSomething() if x === 2นี้ไวยากรณ์ทับทิมที่ชอบ: ฉันไม่ควรพลาดทับทิม แต่ฉันก็คิดถึงมัน
ชาดจอห์นสัน

743

สิ่งที่คุณต้องคือการใช้ที่ผิดปกติอย่างเป็นธรรมของผู้ประกอบ ternary โดยปกติจะใช้เป็นนิพจน์ไม่ใช่ข้อความภายในการดำเนินการอื่น ๆ เช่น:

var y = (x == 2 ? "yes" : "no");

ดังนั้นเพื่อความสะดวกในการอ่าน (เพราะสิ่งที่คุณกำลังทำนั้นผิดปกติ) และเนื่องจากมันหลีกเลี่ยง "อื่น" ที่คุณไม่ต้องการฉันขอแนะนำ:

if (x==2) doSomething();

ในที่นี่เราสามารถเพิ่มการตกแต่งเส้นแทรกเป็นคำสั่งแบบเต็ม (ตัวอย่างของฉันใช้ jquery fade in และ fade out function) x == 2? $ (องค์ประกอบ) .fadeIn (): $ (องค์ประกอบ) .fadeIn (); ไม่จำเป็นต้องมีตัวแปรส่งคืน (เช่น var y ในรหัสแรก)
Godage Prageeth

1
คุณต้องใช้เครื่องหมาย "=" สามอย่างเพื่อให้ตรรกะสมบูรณ์แบบ เช่นเดียวกับใน var y = (x === 2? "ใช่": "ไม่");
fino



14

การใช้nullดีสำหรับสาขาใดสาขาหนึ่งของนิพจน์ประกอบไปด้วย และสำนวนที่ประกอบไปด้วยสามส่วนนั้นก็ดีในประโยคใน Javascript

อย่างไรก็ตามในเรื่องของสไตล์หากคุณมีความคิดในการเรียกใช้โพรซีเดอร์มันชัดเจนกว่าที่จะเขียนสิ่งนี้โดยใช้ถ้า .. อื่น ๆ :

if (x==2) doSomething;
else doSomethingElse

หรือในกรณีของคุณ

if (x==2) doSomething;

6

นอกจากนี้เล็กน้อยในหัวข้อเก่าแก่มาก ..

หากคุณต้องการประเมินนิพจน์ภายใน a for/ whileloop ด้วยโอเปอเรเตอร์ ternary และต้องการcontinueหรือbreakเป็นผล - คุณจะมีปัญหาเพราะทั้งสองcontinue& breakไม่ใช่นิพจน์นั่นเป็นคำสั่งที่ไม่มีค่าใด ๆ

สิ่งนี้จะผลิต Uncaught SyntaxError: Unexpected token continue

 for (const item of myArray) {
      item.value ? break : continue;
 }

หากคุณต้องการซับหนึ่งที่ส่งคืนคำสั่งจริงๆคุณสามารถใช้สิ่งนี้แทน:

  for (const item of myArray) {
      if (item.value) break; else continue;
  }
  • PS - รหัสนี้อาจทำให้คิ้วบาง แค่พูด.. :)

4

ในทางเทคนิคแล้วการใส่ค่า Null หรือ 0 หรือเพียงแค่ค่าสุ่มบางอันก็ใช้ได้ (เนื่องจากคุณไม่ได้ใช้ค่าที่ส่งคืน) อย่างไรก็ตามทำไมคุณใช้การสร้างนี้แทนการifสร้าง จะเห็นได้ชัดน้อยกว่าสิ่งที่คุณพยายามทำเมื่อคุณเขียนโค้ดด้วยวิธีนี้เนื่องจากคุณอาจสร้างความสับสนให้กับคนที่ไม่มีตัวเลือก (null ในกรณีของคุณ)


2

อาจสั้นที่สุด (ขึ้นอยู่กับตัวดำเนินการ ORและลำดับความสำคัญ )

x-2||dosomething()

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