JavaScript中的问号和冒号

我看到了下面这行

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

在这个上下文中,?:是什么意思?

220664 次浏览

? :这不是三元操作符吗?

var x= expression ? true:false

为了清楚起见,它是

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

也就是返回

  • 255*delta/max如果max != 0
  • 0如果max == 0

用括号写出来可能会更清楚一些:

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

它所做的是计算第一个括号里的部分。如果结果为真,那么?在:之前返回。如果为false,则返回:后面的内容。

它被称为条件运算符(它是一个三元运算符)。

它的形式是:condition ?value-if-true: value-if-false
?视为"then",将:视为"else"

你的代码相当于

if (max != 0)
hsb.s = 255 * delta / max;
else
hsb.s = 0;
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;
}

小心这个。虽然-1 !=真,-1 !=假,但A -1的计算结果为真。相信我,我亲眼所见。

所以

1 ?“真边”:“假边”

评估为“真侧”

< p > ?:是else {}if(){}问题的一个速记条件。 所以你的代码是可互换的:

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

MDN -条件(三元)运算符

你所引用的被称为三元运算符,它本质上是一个基本的if条件检查,如果三元操作中的代码块有效,可以编写它来执行操作,否则默认为回退。

三元运算的语法如下:

condition ? exprIfTrue : exprIfFalse
  • condition其值用作条件的表达式。
  • exprIfTrue如果条件值为真相值(等于或可以转换为true),则计算该表达式。
  • exprIfFalse如果条件是falsy(也就是说,有一个可以转换为false的值)则执行的表达式。

例子

取下面给出的函数,如果提供给函数的数字是偶数,则返回字符串Yes,否则返回No

function isEven(num) {
return (num % 2 == 0) ? "Yes" : "No";
}


console.log("2: " + isEven(2));
console.log("3: " + isEven(3));

解释

上述操作分为:

  • (num % 2 == 0) |这是一个简单的if语句条件,用于检查括号内的表达式是否为真。
  • ? "Yes"如果操作为true,则作为执行的结果自动返回给定的字符串字面值。
  • : "No"这是此操作中的else子句,如果不满足条件,则返回No