首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript中链式三元算子的右结合性

JavaScript中链式三元算子的右结合性
EN

Stack Overflow用户
提问于 2022-11-24 07:54:57
回答 2查看 24关注 0票数 1

在JavaScript和MDN中,我读到了关于链式三值运算符的文章,它们是正确的结合。这意味着它们将从右到左进行评估。

三元运算符是右关联的,这意味着它可以以以下方式被“链式”,类似于if…。否则如果…否则如果…其他链:

然而,这让我很困惑。下面是一些示例代码:

代码语言:javascript
运行
复制
var AQI = 340;

var result =
  AQI > 300 //if condition
    ? "Air Quality is BAD"  //if first condition satisfies
    : AQI > 200 //first else-if condition
    ? "Air Quality is NORMAL" 
    : AQI > 100 //second else-if condition
    ? "Air Quality is GOOD"
    : "Air Quality is EXCELLENT"; //if all the conditions fail

如果三元算子是正确的结合算子,它将首先评估这一部分:

代码语言:javascript
运行
复制
AQI > 100 //second else-if condition
    ? "Air Quality is GOOD"
    : "Air Quality is EXCELLENT";

由于空气质量指数超过340,空气质量指数> 100将是真实的,我们将得到“空气质量良好”。然而,真正的产出是“空气质量不好”。

那么,MDN是错误的正确的结合,还是我误解了什么?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-24 08:07:42

不要混淆联想性和评价顺序。它们是不同的概念。

联想意味着操作是如何分组的。这并不意味着与评估顺序相同。

鉴于你的例子:

代码语言:javascript
运行
复制
AQI > 300 //if condition
    ? "Air Quality is BAD"  //if first condition satisfies
    : AQI > 200 //first else-if condition
    ? "Air Quality is NORMAL" 
    : AQI > 100 //second else-if condition
    ? "Air Quality is GOOD"
    : "Air Quality is EXCELLENT";

左联想运算符会将它解释为:

代码语言:javascript
运行
复制
(((AQI > 300 ?
    "Air Quality is BAD"
    : AQI ) > 200 ?
        "Air Quality is NORMAL" 
        : AQI) > 100 ?
            "Air Quality is GOOD"
            : "Air Quality is EXCELLENT")

也就是说,它检查AQI是否大于300,然后检查"Air Quality is BAD"是否大于200,如果大于200,则检查"Air Quality is NORMAL"是否大于100等等。这当然是荒谬的。

右关联逻辑将其解释为:

代码语言:javascript
运行
复制
(AQI > 300 ?
    "Air Quality is BAD"
    : (AQI > 200 ?
        "Air Quality is NORMAL" 
        : (AQI > 100 ?
            "Air Quality is GOOD"
            : "Air Quality is EXCELLENT")))

注意,与左关联不同,它首先完成了右分组。因此,一旦分组完成,然后按从左到右的正常顺序进行计算,检查AQI是否大于300,然后检查AQI是否大于200,然后检查AQI是否大于100。这更有道理。

票数 2
EN

Stack Overflow用户

发布于 2022-11-24 08:00:10

右联想并不意味着它们从右到左被评估。这就意味着他们是由右向左分组的。因此,表达式等价于下面带有括号的代码,这些代码显示了三元数组是如何嵌套的。

代码语言:javascript
运行
复制
var result =
  AQI > 300 //if condition
  ?
  "Air Quality is BAD" //if first condition satisfies
  :
  (AQI > 200 //first else-if condition
    ?
    "Air Quality is NORMAL" :
    (AQI > 100 //second else-if condition
      ?
      "Air Quality is GOOD" :
      "Air Quality is EXCELLENT" //if all the conditions fail
    )
  );

括号只是强制分组,而不是计算顺序。它仍然先计算第一个条件,然后再计算它的结果表达式。

这就是为什么这实际上就像if/else if/.../else

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74557350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档