Dấu hỏi và dấu hai chấm trong JavaScript


Câu trả lời:


363

Nó được gọi là Toán tử có điều kiện (là toán tử ternary ).

Nó có dạng : condition? value-if-true: value-if-false
Hãy nghĩ về ?"sau đó" và :"khác".

Mã của bạn tương đương với

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

27
"?" không phải là nhà điều hành ternary; "?:" là toán tử ternary. Nói về "?" vì người điều hành chim nhạn giống như nói về Abbott mà không có Costello, Laurel không có Hardy, Cheech mà không có Chong ....
Jason S

11
Ok, ok ... bây giờ tôi đang sử dụng một đại từ mơ hồ, hạnh phúc? :)
Greg

14
Để được mô phạm, đó là một toán tử ternary, là ngôn ngữ duy nhất trong hầu hết các ngôn ngữ lập trình. Bất kỳ toán tử nào hoạt động trên 3 phần đều là toán tử bậc ba, giống như additiontoán tử nhị phân hoạt động trên các biểu thức trước và sau (ví dụ 1 + 2 phép cộng hoạt động trên 1 và 2), hoặc phủ định là toán tử đơn nguyên (ví dụ -x trong đó giá trị của x bị phủ định).
Davy8

6
@ Davy8: Và cái này có thể được gọi là toán tử điều kiện cụ thể.
Ốc cơ khí

Nếu bạn muốn kiểm tra hai điều kiện thì sao?
Thanos Dodd

38

Được ngoặc đúng cách cho rõ ràng, đó là

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

nghĩa là trở về

  • 255*delta/max nếu tối đa! = 0
  • 0 nếu tối đa == 0

7

Điều này có lẽ rõ ràng hơn một chút khi được viết với dấu ngoặc như sau:

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

Những gì nó làm là đánh giá phần trong ngoặc đầu tiên. Nếu kết quả là đúng thì phần sau? và trước khi: được trả lại. Nếu nó sai, thì cái gì sau: được trả về.


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

?là một nhà điều hành ternary. Nó hoạt động như một ifkết hợp với:

!= có nghĩa là không bằng

Vì vậy, dạng dài của dòng này sẽ là

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

1

? : Đây không phải là nhà điều hành ternary?

var x= expression ? true:false


3
Đó là một ví dụ về việc sử dụng nó, nhưng thực sự có một phiên bản ngắn hơn của câu lệnh của bạn, đối với những trường hợp bạn chỉ muốn TRUE / FALSE: Nếu 'biểu thức' chỉ là một biến có số hoặc chuỗi trong đó, "var x = !! biểu thức "sẽ làm cho nó thành một kết quả boolean.
Scott Lahteine


-3

Hãy cẩn thận với điều này. A -1 đánh giá là đúng mặc dù -1! = True và -1! = False. Tin tôi đi, tôi đã thấy nó xảy ra.

vì thế

-1? "bên đúng": "bên sai"

đánh giá là "bên thực sự"


3
"Trong JavaScript, một truthy giá trị là một giá trị được coi là đúng khi đánh giá trong một bối cảnh Boolean. Tất cả các giá trị là truthy trừ khi chúng được định nghĩa là falsy (tức là, ngoại trừ sai, 0, '', null, undefined, và NaN) . " Đây là lý do tại sao -1 được đánh giá là đúng. ( developer.mozilla.org/en-US/docs/Glossary/Truthy )
jobmo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.