Javascript ตัวดำเนินการ ternary ชวเลข


104

ฉันรู้ว่าใน php 5.3 แทนที่จะใช้ไวยากรณ์ตัวดำเนินการ ternary ซ้ำซ้อนนี้:

startingNum = startingNum ? startingNum : 1

... เราสามารถใช้ไวยากรณ์ชวเลขสำหรับตัวดำเนินการที่เกี่ยวข้องได้หากมี:

startingNum = startingNum ?: 1

และฉันรู้เกี่ยวกับตัวดำเนินการ ternary ใน javascript:

startingNum = startingNum ? startingNum : 1

... แต่มีชวเลขไหม?

คำตอบ:


179
var startingNumber = startingNumber || 1;

สิ่งที่คล้ายกับสิ่งที่คุณกำลังมองหาซึ่งเป็นค่าเริ่มต้นหากไม่ได้กำหนด?

var foo = bar || 1; // 1
var bar = 2;
foo = bar || 1;     // 2

อย่างไรก็ตามสิ่งนี้ใช้ได้กับหลายสถานการณ์รวมถึงวัตถุ:

var foo = bar || {}; // secure an object is assigned when bar is absent

เมื่อเช้านี้ได้รับการตีกลับ แก้ไข แต่ขอบคุณที่สังเกตเห็น
Brad Christie

1
คุณไม่ได้หมายถึง||แทนที่จะเป็น???
Rocket Hazmat

2
ขอบคุณ! คุณตอกมัน ฉันใช้ออบเจ็กต์ในอินสแตนซ์นี้จริงๆ :)
Web_Designer

8
สำหรับใครก็ตามที่อยากรู้อยากเห็นสิ่งนี้ใช้ได้เพราะ||ตัวดำเนินการของ JS ไม่คืนค่าจริงหรือเท็จมันจะส่งคืนค่า 'ความจริง' แรก สมมติว่าคุณมีval0และval1เป็นundefinedและval2เป็น2, คือ val3 จะกลับมาเนื่องจากเป็นค่า 'ความจริง' แรก 3val0 || val1 || val2 || val32
Jake T.

2
สำนวนนี้ไม่ใช่รูปแบบการต่อต้านหรือไม่? จะเกิดอะไรขึ้นถ้าคุณส่ง 0 หรือสตริงว่างนิพจน์ "OR" จะข้ามไปและใช้ค่าเริ่มต้นในตำแหน่งที่คุณต้องการเป็น 0 หรือสตริงว่าง
Paul Trzyna

24

|| จะส่งคืนค่าความจริงแรกที่พบดังนั้นจึงสามารถใช้เป็นตัวดำเนินการรวมกันได้เช่นเดียวกับ C # ??

startingNum = startingNum || 1;

ฉันชอบคำอธิบายของคุณมากกว่าคำอธิบายอื่น ๆ
ajax333221

12

ใช่มี:

var startingNum = startingNum || 1;

โดยทั่วไปexpr1 || expr2ทำงานในลักษณะต่อไปนี้ (ตามที่กล่าวไว้ในเอกสารประกอบ ):

ส่งคืนexpr1หากสามารถแปลงเป็นtrue; expr2มิฉะนั้นผลตอบแทน ดังนั้นเมื่อใช้กับBooleanค่า||จะส่งกลับtrueถ้าตัวถูกดำเนินการเป็นtrue; ถ้าทั้งสองมีผลตอบแทนfalsefalse


ไม่ถูกต้องกว่าที่จะพูดif a is truthyกับif a is evaluated to true?
JaredPar

3
@JaredPar: เพื่อหลีกเลี่ยงความคลุมเครือฉันได้แทนที่คำอธิบายโดยละเอียดเดิมของฉันด้วยคำอธิบายจาก Mozilla Developer Network ควรมีความคลุมเครือน้อยกว่า
Tadeck


2
startingNum = startingNum || 1

หากคุณมีเงื่อนไขที่เป็นโมฆะเช่น

startingNum = startingNum ? startingNum : null

คุณสามารถใช้ได้ '&&'

startingNum = startingNum && startingNum

แต่จะไม่anything && nullประเมินค่าเป็นโมฆะเว้นแต่anythingจะเป็นเท็จ?
Petruza

ใช่ถ้าสิ่งใดเป็นจริงมันจะประเมินว่าเป็นโมฆะ หากเป็นเท็จให้ประเมินเป็นค่า
เท็จ

1

คำตอบข้างต้นถูกต้อง ใน JavaScript คำสั่งต่อไปนี้:

startingNum = startingNum ? otherNum : 1

สามารถแสดงเป็น

startingNum = otherNum || 1

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

startingNum = startingNum ? otherNum : 0

แต่สามารถแสดงเป็น

startingNum = startingNum && otherNum

เพียงต้องการครอบคลุมสถานการณ์อื่นในกรณีที่คนอื่นกำลังมองหาคำตอบที่ครอบคลุมมากขึ้น


มีชวเลขสำหรับอะไรแบบนี้x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24???
oldboy

@ แอนโธนี่ไม่เพราะinnerWidth * 0.0375 > 24แตกต่างจากif trueส่วนที่เป็นinnerWidth * 0.0375. สามารถใช้ชวเลขได้ก็ต่อเมื่อค่าexpression to be evaluatedและif trueค่าเดียวกัน เหมือนกันว่าทำไมคุณไม่สามารถจดชวเลขx = someBoolean ? 'Heck yea!' : 'No way!'ได้
โฉนด

@deedub ดีจริงมี "ชวเลข" (ถ้าเรียกอย่างนั้น) ซึ่งจะเป็นMath.max(innerWidth * 0.0375, 24)
oldboy

@ แอนโธนี่คุณจะไม่เรียกมันว่า;) แต่Math.maxทำงานได้ดีกว่าตัวดำเนินการที่เกี่ยวข้องในกรณีการใช้งานของคุณ
โฉนด

1
" startingNum = startingNum ? otherNum : 1สามารถแสดงเป็นstartingNum = otherNum || 1" ผิด ฉันเพิ่งทดสอบสิ่งนี้
oldboy

0

ในการสร้าง ternary เช่น:

boolean_condition ? true_result : false_result

ในจาวาสคริปต์คุณสามารถทำได้:

(boolean_condition && true_result ) || false_result;

ตัวอย่าง:

(true && 'green') || 'red';
=> "green"
(false && 'green') || 'red';
=> "red"

งั้นx = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24จะกลายเป็น(innerWidth * 0.0375 > 24 && innerWidth * 0.0375) || 24?? มีชวเลขเพื่อที่ฉันจะได้ไม่ต้องพูดซ้ำinnerWidth * 0.0375นอกจากกำหนดให้ตัวแปร ???
oldboy

1
ในกรณีนี้Math.max( innerWidth * 0.0375 , 24 )จะทำงานอย่างหรูหรา สำหรับกรณีทั่วไปมันจะเป็นการดีที่จะสร้างวิธีการอธิบายที่เรียกว่าเช่น 'somethingifiedInnerWidth' ซึ่งช่วยเพิ่มความสามารถในการอ่านแทนที่จะสร้างตัวแปร แม้ว่าในบางกรณีจะมีตัวแปร (ของชื่อที่สื่อความหมาย) ให้อ่านได้มากกว่าดังนั้นในอนาคตคำถาม 'ทำไมจึงคูณด้วยสิ่งนี้?' ไม่ได้ยกขึ้น
xxjjnn

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