Вопросительный знак и двоеточие в JavaScript

249

Я наткнулся на следующую строку

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

Что значит ?и :что в этом контексте?

Inaimathi
источник
Похоже, что избегать установки насыщенности Infinity(вызванной делением на ноль).
Crescent Fresh

Ответы:

363

Он называется условным оператором (который является троичным оператором ).

Она имеет вид: condition? value-if-true: value-if-false
Подумайте о ?качестве «тогда» и :как «другие».

Ваш код эквивалентен

if (max != 0)
  hsb.s = 255 * delta / max;
else
  hsb.s = 0;
Greg
источник
27
"?" не троичный оператор; «?:» - троичный оператор. Говоря о "?" так как троичный оператор похож на разговор об Эбботте без Костелло, Лорел без Харди, Чич без Чонга ...
Джейсон С
11
Хорошо, хорошо ... теперь я использую неоднозначное местоимение, счастлив? :)
Грег
14
Чтобы быть педантичным, это троичный оператор, который бывает только один в большинстве языков программирования. Любой оператор, который работает на 3 части, является троичным оператором, так же как и бинарный оператор, который работает с предыдущими и последующими выражениями (например, 1 + 2 плюс работает с 1 и 2), или отрицание является унарным оператором (например, -x где значение х отрицается). addition
Davy8
6
@ Davy8: И это можно назвать условным оператором, чтобы быть конкретным.
Механическая улитка
Что если вы хотите проверить два условия?
Танос Додд
38

Правильно заключенные в скобки для ясности, это

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

означает возвращение либо

  • 255*delta/max если max! = 0
  • 0 если max == 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;
}
CaffGeek
источник
1

? : разве это не троичный оператор?

var x= expression ? true:false

jldupont
источник
3
Это один из примеров его использования, но на самом деле существует более короткая версия вашего оператора, для тех случаев, когда вы просто хотите ИСТИНА / ЛОЖЬ: если выражение было просто некоторой переменной с числом или строкой, «var x = !! выражение "превратит это в логический результат.
Скотт Лахтейн
-3

Будьте осторожны с этим. -1 оценивается как true, хотя -1! = True и -1! = False. Поверь мне, я видел, как это случилось.

так

-1? «истинная сторона»: «ложная сторона»

оценивает "истинную сторону"

МИБ
источник
3
«В JavaScript истинное значение - это значение, которое считается истинным при оценке в логическом контексте. Все значения являются достоверными, если они не определены как ложные (т. Е. За исключением false, 0», «null, undefined и NaN). «. Вот почему -1 оценивается как истина. ( developer.mozilla.org/en-US/docs/Glossary/Truthy )
вакансия