เครื่องหมายคำถามและโคลอนใน JavaScript


249

ฉันมาข้ามบรรทัดต่อไปนี้

hsb.s = max != 0 ? 255 * delta / max : 0;

สิ่งที่?และ:หมายถึงอะไรในบริบทนี้


ดูเหมือนจะหลีกเลี่ยงการตั้งค่าความอิ่มตัวเป็นInfinity(เกิดจากหารด้วยศูนย์)
Crescent Fresh

คำตอบ:


363

มันถูกเรียกว่าผู้ประกอบการเงื่อนไข (ซึ่งเป็นผู้ประกอบการประกอบไปด้วย)

มันมีรูปแบบของ: condition? value-if-true: value-if-false
คิดว่า?"แล้ว" และ:"อื่น ๆ "

รหัสของคุณเทียบเท่า

if (max != 0)
  hsb.s = 255 * delta / max;
else
  hsb.s = 0;

27
"?" ไม่ใช่ผู้ประกอบการที่สาม "?:" เป็นผู้ประกอบการที่สาม พูดคุยเกี่ยวกับ "?" เป็นผู้ประกอบการที่ประกอบไปด้วยเป็นเหมือนการพูดคุยเกี่ยวกับแอ๊บบอตได้โดยไม่ต้องคอสเตลโล, ลอเรลโดยไม่ต้อง Hardy, Cheech ปากช่องโดยไม่ต้อง ....
เจสัน S

11
ตกลงโอเค ... ตอนนี้ฉันใช้สรรพนามที่คลุมเครือมีความสุขใช่ไหม :)
Greg

14
เป็นคนคล่องแคล่วมันเป็นผู้ประกอบการที่สามซึ่งเกิดขึ้นเป็นคนเดียวในภาษาโปรแกรมส่วนใหญ่ ตัวดำเนินการใด ๆ ที่ทำงานบน 3 ส่วนคือตัวดำเนินการที่ประกอบไปด้วยเช่นเดียวadditionกับตัวดำเนินการไบนารีที่ทำงานกับนิพจน์ก่อนหน้าและต่อไปนี้ (เช่น 1 + 2 บวกกับทำงานบน 1 และ 2) หรือปฏิเสธเป็นตัวดำเนินการเอก (เช่น -x โดยที่ค่าของ x ถูกลบล้าง)
Davy8

6
@ Davy8: และอันนี้สามารถเรียกได้ว่าผู้ประกอบการตามเงื่อนไขที่เฉพาะเจาะจง
หอยทากเชิงกล

ถ้าคุณต้องการตรวจสอบสองเงื่อนไข
Thanos Dodd

38

วงเล็บอย่างถูกต้องเพื่อความชัดเจนมันเป็น

hsb.s = (max != 0) ? (255 * delta / max) : 0;

ความหมายกลับมาอย่างใดอย่างหนึ่ง

  • 255*delta/max ถ้าสูงสุด! = 0
  • 0 ถ้าสูงสุด == 0

7

นี่อาจจะค่อนข้างชัดเจนเมื่อเขียนด้วยวงเล็บดังนี้

hsb.s = (max != 0) ? (255 * delta / max) : 0;

มันคืออะไรประเมินส่วนในวงเล็บแรก หากผลลัพธ์เป็นจริงแล้วส่วนหลัง? และก่อน: ถูกส่งคืน ถ้ามันเป็นเท็จแล้วสิ่งต่อไปนี้: จะถูกส่งกลับ


7
hsb.s = max != 0 ? 255 * delta / max : 0;

?เป็นผู้ประกอบการที่สาม มันทำงานเหมือนifร่วมกับ:

!= หมายถึงไม่เท่ากับ

ดังนั้นรูปแบบยาวของเส้นนี้จะเป็น

if (max != 0) { //if max is not zero
  hsb.s = 255 * delta / max;
} else {
  hsb.s = 0;
}

1

? : นี่ไม่ใช่ผู้ประกอบการที่สามหรือไม่

var x= expression ? true:false


3
นี่เป็นตัวอย่างหนึ่งของการใช้งาน แต่จริงๆแล้วมันมีเวอร์ชันย่อของคำสั่งของคุณสำหรับกรณีที่คุณต้องการ TRUE / FALSE: หาก 'expression' เป็นเพียงตัวแปรบางตัวที่มีตัวเลขหรือสตริงอยู่ "var x = !! การแสดงออก "จะทำให้เป็นผลบูลีน
Scott Lahteine


-3

ระวังด้วยนะ -1 ประเมินเป็นจริงแม้ว่า -1! = จริงและ -1! = เท็จ เชื่อใจฉันฉันเห็นมันเกิดขึ้น

ดังนั้น

-1 "ด้านที่แท้จริง": "ด้านที่ผิด"

ประเมินเป็น "ด้านที่แท้จริง"


3
"ใน JavaScript เป็นtruthyคุ้มค่าคุ้มค่าที่ถือว่าเป็นจริงเมื่อได้รับการประเมินในบริบทบูลีน. ค่าทั้งหมดอยู่ truthy จนกว่าพวกเขาจะถูกกำหนดเป็น falsy (เช่นยกเว้นเท็จ, 0, '' โมฆะไม่ได้กำหนดและน่าน) ." นี่คือเหตุผลที่ -1 ถูกประเมินว่าเป็นจริง ( developer.mozilla.org/en-US/docs/Glossary/Truthy )
jobmo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.