JavaScript บรรทัดเดียว 'if' คำสั่ง - ไวยากรณ์ที่ดีที่สุดทางเลือกนี้หรือไม่


201

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

แต่แล้วเรื่องนี้ล่ะ

if (lemons) { document.write("foo gave me a bar"); }

มันจะถูกบีบอัดมากขึ้นและถ้าขยายออกไปวงเล็บปีกกาจะไม่ถูกลืม มีปัญหาอะไรที่โจ่งแจ้งหรือไม่และถ้าไม่จะต้องพิจารณาอะไรบ้าง? ฉันรู้สึกว่ามันยังคงอ่านได้อย่างน้อยก็มากเท่ากับผู้ประกอบการที่สาม สำหรับฉันดูเหมือนว่าผู้ประกอบการที่ประกอบไปด้วยสามคนไม่ได้รับการแนะนำเท่าที่ควรเนื่องจากความสามารถในการอ่านแม้ว่าฉันจะรู้สึกว่าข้อสรุปนั้นไม่ได้เป็นเอกฉันท์

แฝดชั่วร้ายในตัวฉันต้องการที่จะแนะนำสิ่งนี้ถึงแม้ว่าไวยากรณ์จะไม่ชัดเจนสำหรับมันและอาจเป็นเพียงความคิดที่ไม่ดี

(syntax) ? document.write("My evil twin emerges"): "";

2
จะดีถ้า JavaScript สนับสนุนการสิ้นสุดของเงื่อนไขเงื่อนไข:document.write("My evil twin emerges") if lemons
Beau Smith

7
ฉันคิดว่าคุณอาจจะคิดถึงเรื่องสั้นถ้าเป็นอย่างอื่น ( variable = (condition) ? true-value : false-value;.) โชคดี
Progo

คำตอบ:


328

ฉันเคยเห็นพฤติกรรมการลัดวงจรของ&&ผู้ปฏิบัติงานที่ใช้เพื่อให้บรรลุถึงสิ่งนี้แม้ว่าผู้ที่ไม่คุ้นเคยกับสิ่งนี้อาจพบว่าอ่านยากหรือแม้แต่เรียกว่ารูปแบบการต่อต้าน:

lemons && document.write("foo gave me a bar");  

โดยส่วนตัวฉันมักจะใช้บรรทัดเดียวifโดยไม่มีวงเล็บเหลี่ยมเช่นนี้

if (lemons) document.write("foo gave me a bar");

หากฉันต้องการเพิ่มคำสั่งเพิ่มเติมฉันจะใส่คำสั่งในบรรทัดถัดไปและเพิ่มเครื่องหมายวงเล็บ เนื่องจาก IDE ของฉันทำการย่อหน้าอัตโนมัติการคัดค้านการบำรุงรักษาสำหรับการฝึกนี้จึงเป็นสิ่งที่สงสัย


11
ฉันชอบอันหลัง ขอบคุณสำหรับการป้อนข้อมูลและอีกหนึ่งทางเลือกที่สร้างสรรค์มากขึ้นในครั้งแรก!
David Hobs

คุณควรจะรู้ว่าสิ่งที่คุณคาดหวังตั้งแต่สตริงที่ว่างเปล่าและ 0 เป็นค่า falsy ก็จะล้มเหลวดำเนินการคำสั่งที่สอง
ออร์แลนโด

1
แน่นอนคุณสามารถเช่นเดียวกับดีใส่คำสั่งแบบบูลที่ชัดเจนมากขึ้นในการมี
acjay

7
@PeterOlson เหตุใดข้อโต้แย้งในการบำรุงรักษาจึงเป็นข้อโต้แย้ง จะเกิดอะไรขึ้นหากผู้พัฒนารายอื่นไม่ได้ใช้ IDE กับการกำหนดค่า
agconti

2
ขอบคุณสำหรับความกล้าหาญพอที่จะพูดออกมาในการสนับสนุนของบรรทัดเดียวถ้างบที่ไม่มีวงเล็บ วันหนึ่งลูกหลานของเราจะขอบคุณ
Marc M.

135

ฉันใช้มันแบบนี้:

(lemons) ? alert("please give me a lemonade") : alert("then give me a beer");

35
alert(lemons?"please give me a lemonade":"then give me a beer")
MrVaykadji

43

คุณสามารถใช้รูปแบบนี้ซึ่งใช้กันทั่วไปใน PHP:

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");

12
lemonคุณไม่จำเป็นต้องวงเล็บบน
leymannx

6
สามารถเป็นแนวปฏิบัติที่ดีที่สุดในการรวม () รอบข้อความสั่งแบบมีเงื่อนไข - กำจัดความสับสนใด ๆ เกี่ยวกับคำสั่งของการดำเนินการอื่น ๆ สำหรับนักพัฒนาอื่น ๆ ฉันมักจะทำผิดต่อการระบุยกเว้นเมื่อไม่มีวิธีที่เหมาะสมสำหรับคนที่จะสับสน
djvs

1
document.write(lemon ? "foo gave me a bar" : "if condition is FALSE");:)
Joseph Goh

ฉันชอบวงเล็บเหมือนกับฉันพวกเขาบ่งบอกถึงการบีบบังคับแบบบูล
Daniel Sokolowski

18

บรรทัดนี้สะอาดกว่ามาก

if(dog) alert('bark bark');

ฉันชอบสิ่งนี้ หวังว่าจะช่วยใครซักคน


16

สามารถใช้สิ่งนี้

lemons ? alert("please give me a lemonade") : alert("then give me a beer");

คำอธิบาย: หากlemonsมีอยู่แล้วให้ฉันalert("please give me a lemonade") else alert("then give me a beer")


ทางออกที่ดี
Davidson Lima

1
lemons? alert("please give me a fancy beer with a lemon wedge in it"): alert(please give me a beer")FTFY
Stib

15

// อีกตัวอย่างง่ายๆ

 var a = 11;
 a == 10 ? alert("true") : alert("false");

15
ทำไมไม่เพียงแค่ .. var a = 11; alert(a === 10);?
ManuKaracho

@ManuKaracho ฉันเห็นปัญหานี้มากเมื่อทำงานกับงบแบบไตรภาค ฉันเข้าใจว่า OP อาจพยายามเขียนง่าย ๆ แต่มันอาละวาดในรหัสที่ฉันอ่านในที่ทำงาน
adam-beck

alert(a === 10 ? "true" : "false")
Josh Wood

@JoshWood การแจ้งเตือนจะพิมพ์ booleans ด้วยดังนั้นคุณสามารถทำได้alert(a===10)เหมือนที่มนูกล่าว
Keith

12

อย่างที่หลายคนพูดถ้าคุณกำลังมองหา 1 บรรทัดจริงถ้าเป็นเช่นนั้น:

    if (Boolean_expression) do.something();

เป็นที่ต้องการ อย่างไรก็ตามหากคุณต้องการทำ if / else ถ้าเป็นแบบไตรภาคคือเพื่อนของคุณ (และยังเด็ดสุด ๆ ):

    (Boolean_expression) ? do.somethingForTrue() : do.somethingForFalse();

เพิ่มเติม:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

อย่างไรก็ตามฉันเห็นตัวอย่างที่ยอดเยี่ยมหนึ่งตัวอย่าง ส่งเสียงไปที่ @ Peter-Oslson สำหรับ &&

    (Boolean_expression) && do.something();

สุดท้ายมันไม่ใช่คำสั่ง if แต่ดำเนินการสิ่งต่าง ๆ ในลูปด้วย map / ลดหรือ Promise.resolve () ก็สนุกเช่นกัน ส่งเสียงไปที่ @brunettdan


7

ตามที่ระบุไว้แล้วคุณสามารถใช้:

&& สไตล์

lemons && document.write("foo gave me a bar");  

หรือ

สไตล์วงเล็บเหลี่ยมน้อย

if (lemons) document.write("foo gave me a bar");

กลับลัดวงจร

อย่างไรก็ตามหากคุณต้องการใช้ifคำสั่งหนึ่งบรรทัดเพื่อลัดวงจรฟังก์ชั่นคุณจะต้องไปกับเวอร์ชันที่ไม่มีวงเล็บเหลี่ยมดังนี้

if (lemons) return "foo gave me a bar";

เช่น

lemons && return "foo gave me a bar"; // does not work!

จะให้ SyntaxError: Unexpected keyword 'return'


ในวงจรลัดวงจรแบบบรรทัดเดียวเราสามารถละเว้น 'return' และควรทำงานตามที่คาดไว้ `` `มะนาว &&" foo มอบบาร์ให้ฉัน "; // งาน! `` `
siwalikm

@siwalikm คุณอธิบายได้ไหม? นี่เป็นกรณีที่คุณไม่ต้องการส่งคืนlemons(ถ้าเป็นเท็จ) - คุณเพียงต้องการส่งคืน "foo lemonsGive me bar" เมื่อเป็นความจริง
Marc

ถ้า (มะนาว) ส่งคืน "foo ให้บาร์ฉัน"; นี่มันผิด มันจะทำให้คุณ "Uncaught SyntaxError: คำสั่งการส่งคืนที่ผิดกฎหมาย"
Fenec

@Fenec คุณจะแบ่งปันเบราว์เซอร์และรุ่นที่ทำให้คุณเกิดข้อผิดพลาดนี้หรือไม่? สิ่งนี้ใช้ได้กับฉันเกือบ 2 ปีที่แล้วและทำงานให้ฉันต่อไป
Marc

4

ฉันเห็นคำตอบมากมายด้วยคะแนนเสียงมากมายที่เรียกร้องให้ใช้ผู้ประกอบการที่ประกอบไปด้วยไตรภาค Ternary นั้นยอดเยี่ยมถ้า a) คุณมีทางเลือกอื่นและ b) คุณกำลังคืนค่าที่ค่อนข้างง่ายจากเงื่อนไขที่เรียบง่าย แต่...

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

lemons ? "foo gave me a bar" : "who knows what you'll get back"

ฉันคิดว่ารูปแบบที่พบบ่อยที่สุดคือlemons ? 'foo...' : ''และอย่างที่คุณทราบจากการอ่านบทความมากมายเกี่ยวกับภาษาใด ๆ เกี่ยวกับความจริงเท็จความจริงความเท็จความเท็จความว่างเปล่าไม่มีศูนย์ว่างเปล่า (โดยที่ไม่มีของเรา) คุณกำลังเข้า เขตที่วางทุ่นระเบิด (แม้ว่าจะเป็นเขตที่วางทุ่นระเบิดเป็นอย่างดี)

ทันทีที่ส่วนใดส่วนหนึ่งของไตรภาคได้รับความซับซ้อนคุณจะดีกว่าด้วยรูปแบบที่มีเงื่อนไขที่ชัดเจนยิ่งขึ้น

if (lemons) "foo"ทางยาวที่จะบอกว่าฉันกำลังลงคะแนนให้


2

มันสามารถทำได้โดยใช้บรรทัดเดียวกับwhileลูปและifเช่นนี้

if (blah)
    doThis();

มันยังใช้งานได้กับwhileลูป


7
สิ่งนี้จะล้มเหลวและไม่แนะนำให้ใช้
danwellman

9
OP ยังขอหนึ่งซับ
aaron-coding

2

ตัวอย่างฟังก์ชั่นลูกศร:

let somethingTrue = true
[1,2,3,4,5].map(i=>somethingTrue && i*2)

ในสัญญา:

Promise.resolve()
  .then(_=>checkTrueFalse && asyncFunc())
  .then(_=>{ .. })

มิฉะนั้น:

if(somethingTrue) thenDo()

หากเป็นเพียงเงื่อนไขง่าย ๆ ฉันชอบใช้if (value)ทุกครั้งที่ทำได้เพราะคำว่าถ้าในตอนต้นของข้อความระบุว่าเพิ่มเติมเกี่ยวกับสิ่งที่เกิดขึ้นกว่า paranthesis และ questionmarks


1
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

แม้แต่การมอบหมายงานเรายังสามารถทำได้กับวงเล็บเหลี่ยม

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));

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