Tanda tanya dan titik dua dalam JavaScript

249

Saya menemukan baris berikut

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

Apa maksud ?dan tujuan :dari konteks ini?

Inaimathi
sumber
Tampaknya menghindari pengaturan saturasi ke Infinity(disebabkan oleh divide-by-zero).
Crescent Fresh

Jawaban:

363

Ini disebut Operator Bersyarat (yang merupakan operator ternary ).

Ini memiliki bentuk condition:? value-if-true: value-if-false
Pikirkan ?sebagai "lalu" dan :sebagai "lain".

Kode Anda setara dengan

if (max != 0)
  hsb.s = 255 * delta / max;
else
  hsb.s = 0;
Greg
sumber
27
"?" bukan operator ternary; "?:" adalah operator ternary. Membicarakan tentang "?" sebagai operator ternary adalah seperti berbicara tentang Abbott tanpa Costello, Laurel tanpa Hardy, Cheech tanpa Chong ....
Jason S
11
Ok, ok ... sekarang saya menggunakan kata ganti yang mendua, senang? :)
Greg
14
Untuk menjadi bertele-tele, itu sebuah operator ternary, yang terjadi menjadi satu-satunya di kebanyakan bahasa pemrograman. Setiap operator yang bekerja pada 3 bagian adalah operator ternary, sama seperti additionoperator biner yang beroperasi pada ekspresi sebelum dan sesudahnya (mis. 1 + 2 plus beroperasi pada 1 dan 2), atau negasi adalah operator unary (mis. -X di mana nilai x dinegasikan).
Davy8
6
@ Davy8: Dan yang ini bisa disebut operator kondisional untuk lebih spesifik.
Siput mekanik
Bagaimana jika Anda ingin memeriksa dua syarat?
Thanos Dodd
38

Dipasangkan dengan benar untuk kejelasan, itu

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

artinya kembali juga

  • 255*delta/max jika maks! = 0
  • 0 jika maks == 0
Jason S
sumber
7

Ini mungkin sedikit lebih jelas ketika ditulis dengan tanda kurung sebagai berikut:

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

Apa yang dilakukannya adalah mengevaluasi bagian dalam tanda kurung pertama. Jika hasilnya benar maka bagian setelah? dan sebelum: dikembalikan. Jika salah, maka yang berikut: dikembalikan.

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

?adalah operator ternary. Ini bekerja seperti ifdalam hubungannya dengan:

!= berarti tidak sama

Jadi, bentuk panjang dari garis ini adalah

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

? : bukankah ini operator ternary?

var x= expression ? true:false

jldupont
sumber
3
Itu salah satu contoh penggunaannya, tetapi sebenarnya ada versi yang lebih pendek dari pernyataan Anda, untuk kasus-kasus di mana Anda hanya ingin BENAR / SALAH: Jika 'ekspresi' hanya beberapa variabel dengan angka atau string di dalamnya, "var x = !! ekspresi "akan membuatnya menjadi hasil boolean.
Scott Lahteine
0

?: Apakah kondisi singkat untuk else {}dan if(){}masalah. Jadi kode Anda dapat dipertukarkan dengan ini:

if(max != 0){
       hsb.s = 225 * delta / max
}
else {
       hsb.s = 0
}

MDN - Operator Bersyarat (Ternary)

PIZZZZZZZZZZZA ada di sini
sumber
-3

Hati-hati dengan ini. A -1 mengevaluasi true meskipun -1! = Benar dan -1! = Salah. Percayalah, saya sudah melihatnya terjadi.

begitu

-1? "true side": "false side"

mengevaluasi ke "sisi sebenarnya"

MEB
sumber
3
"Dalam JavaScript, nilai kebenaran adalah nilai yang dianggap benar ketika dievaluasi dalam konteks Boolean. Semua nilai itu benar kecuali mereka didefinisikan sebagai falsy (yaitu, kecuali untuk false, 0," ", null, undefined, dan NaN) . " Inilah sebabnya mengapa -1 dievaluasi sebagai benar. ( developer.mozilla.org/en-US/docs/Glossary/Truthy )
jobmo