Operator terner singkatan javascript

102

Saya tahu bahwa di php 5.3 daripada menggunakan sintaks operator terner redundan ini:

startingNum = startingNum ? startingNum : 1

... kita dapat menggunakan sintaks singkatan untuk operator terner jika memungkinkan:

startingNum = startingNum ?: 1

Dan saya tahu tentang operator terner di javascript:

startingNum = startingNum ? startingNum : 1

... tapi apakah ada singkatannya?

Desainer web
sumber

Jawaban:

177
var startingNumber = startingNumber || 1;

Sesuatu seperti itu yang Anda cari, di mana defaultnya jika tidak ditentukan?

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

Ngomong-ngomong, ini berfungsi untuk banyak skenario, termasuk objek:

var foo = bar || {}; // secure an object is assigned when bar is absent
Brad Christie
sumber
Memang tadi pagi sudah mantul. Diperbaiki, tapi terima kasih sudah memperhatikan.
Brad Christie
1
Bukankah maksudmu ||bukan ???
Roket Hazmat
2
Terima kasih! Kamu berhasil. Saya sebenarnya menggunakan objek dalam hal ini. :)
Web_Designer
8
Bagi siapa pun yang penasaran, ini berfungsi karena ||operator JS tidak mengembalikan benar atau salah, ia mengembalikan nilai 'kebenaran' pertama. Katakanlah Anda memiliki val0dan val1sebagai undefined, dan val2adalah 2, val3adalah 3. val0 || val1 || val2 || val3akan kembali 2, karena ini adalah nilai 'kebenaran' pertama.
Jake T.
2
Bukankah idiom ini anti-pola? Bagaimana jika Anda melewatkan 0 atau string kosong, ekspresi 'OR' akan melewatkannya dan menggunakan nilai default di mana Anda sebenarnya menginginkan 0 atau string kosong.
Paul Trzyna
24

|| akan mengembalikan nilai kebenaran pertama yang ditemuinya, dan oleh karena itu dapat digunakan sebagai operator penggabungan, mirip dengan C # ??

startingNum = startingNum || 1;
Adam Rackis
sumber
Saya suka penjelasan Anda lebih dari yang lain
ajax333221
12

Ya ada:

var startingNum = startingNum || 1;

Secara umum, expr1 || expr2bekerja dengan cara berikut (seperti yang disebutkan dalam dokumentasi ):

Mengembalikan expr1jika dapat dikonversi menjadi true; jika tidak, kembali expr2. Dengan demikian, bila digunakan dengan Booleannilai-nilai, ||pengembalian truejika operan baik adalah true; jika keduanya false, kembali false.

Tadeck
sumber
Bukankah lebih tepat untuk mengatakan if a is truthyvs. if a is evaluated to true?
JaredPar
3
@JaredPar: Untuk menghindari ambiguitas, saya telah mengganti penjelasan rinci asli saya dengan penjelasan dari Mozilla Developer Network. Ini harus tidak terlalu ambigu.
Tadeck
2
var startingNum = startingNum || 1;

Dalam hal ini, Anda dapat menggunakan operator OR.

Daniel
sumber
2
startingNum = startingNum || 1

Jika Anda memiliki kondisi dengan null, seperti

startingNum = startingNum ? startingNum : null

kamu bisa memakai '&&'

startingNum = startingNum && startingNum
a2441918
sumber
Tetapi tidak akan anything && nullmengevaluasi ke nol kecuali anythingsalah?
Petruza
Ya, jika ada yang benar, nilainya menjadi nol. Jika itu salah, evaluasi ke nilai yang salah
a2441918
1

Jawaban di atas benar. Dalam JavaScript, pernyataan berikut:

startingNum = startingNum ? otherNum : 1

dapat dinyatakan sebagai

startingNum = otherNum || 1

Skenario lain yang tidak tercakup di sini adalah jika Anda ingin nilai kembali salah jika tidak cocok. Singkatan JavaScript untuk ini adalah:

startingNum = startingNum ? otherNum : 0

Tapi itu bisa dinyatakan sebagai

startingNum = startingNum && otherNum

Hanya ingin meliput skenario lain jika orang lain mencari jawaban yang lebih umum.

John Pace
sumber
apakah ada singkatan untuk sesuatu seperti ini: x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24???
oldboy
@Anthony Tidak, karena innerWidth * 0.0375 > 24berbeda dengan if truebagian yang mana innerWidth * 0.0375. Singkatan hanya dapat digunakan jika expression to be evaluateddan the if truememiliki nilai yang sama. Sama mengapa Anda tidak bisa menyingkat x = someBoolean ? 'Heck yea!' : 'No way!'.
deedub
@deedub, sebenarnya, ada "singkatan" (jika Anda menyebutnya begitu) yang akanMath.max(innerWidth * 0.0375, 24)
oldboy
@Anthony Anda tidak akan menyebutnya begitu;) Tetapi Math.maxbekerja lebih baik daripada operator terner dalam kasus penggunaan Anda.
deedub
1
" startingNum = startingNum ? otherNum : 1dapat diekspresikan sebagai startingNum = otherNum || 1" salah. saya baru saja menguji ini
oldboy
0

Untuk membuat terner seperti:

boolean_condition ? true_result : false_result

dalam javascript, Anda dapat melakukan:

(boolean_condition && true_result ) || false_result;

Contoh:

(true && 'green') || 'red';
=> "green"
(false && 'green') || 'red';
=> "red"
xxjjnn
sumber
sooo x = innerWidth * 0.0375 > 24 ? innerWidth * 0.0375 : 24akan menjadi (innerWidth * 0.0375 > 24 && innerWidth * 0.0375) || 24?? apakah ada singkatan, sehingga saya tidak perlu mengulang innerWidth * 0.0375, selain menugaskannya ke variabel ???
oldboy
1
Dalam hal ini, Math.max( innerWidth * 0.0375 , 24 )akan bekerja dengan elegan. Untuk kasus yang lebih umum, akan lebih baik untuk membuat metode deskriptif yang disebut misalnya 'somethingifiedInnerWidth' yang meningkatkan keterbacaan, daripada membuat variabel. Meskipun dalam beberapa kasus akan lebih mudah dibaca untuk memiliki variabel (dari nama deskriptif itu), jadi di masa depan pertanyaan 'mengapa dikalikan dengan ini?' tidak dinaikkan.
xxjjnn
wow bahkan tidak tahu kamu bisa memberikan argumen ke-2 Math.max. solusi super elegan !!
oldboy