【问题标题】:How is this JavaScript ternary operator working这个 JavaScript 三元运算符是如何工作的
【发布时间】:2012-11-11 10:39:37
【问题描述】:

祝大家感恩节快乐:

我已经在这个问题上绞尽脑汁了半个小时,但还是不知道条件句的作用在哪里。我想我已经记下来了,但只是想由专业人士来运行它。

(i%3)?(i%5)?i:'Buzz':(i%5)?'Fizz':'FizzBuzz'

具体如下:

    if ((i%3) == false) {
        if ((i%5) == false) {
            console.log("FizzBuzz");
        } else {
            console.log('Fizz');
        }
    } else {
        if ((i%5) == false) {
            console.log("Buzz");
        } else {
            console.log(i);
        }
    }

并且我假设三元运算符按以下方式分组(我习惯于以典型的 result ?a : b 方式查看三元运算符,所以额外的结果和条件让我)

(i%3)?
    //if the condition is not a multiple of 3
    //check if it is a multiple of 5
    //if it isn't, log the number
    //otherwise log "Buzz" 
    (i%5)?i:'Buzz'
    //if the condition is a multiple of 3
    //check if it is a multiple of 5
    :(i%5)?
        //if it is log "Fizz", 
        //otherwise i is a multiple of 3 & 5 -
        //log "FizzBuzz"
        'Fizz':'FizzBuzz

我非常感谢任何量化的帖子和/或澄清。 再次感谢。

【问题讨论】:

标签: javascript conditional ternary-operator


【解决方案1】:

三元运算符有right-to-left associativity,表示表达式与

(i%3) ? ((i%5) ? i : 'Buzz') : ((i%5) ? 'Fizz' : 'FizzBuzz')

或者它以下列方式分解

1st ? ( 2nd ) : ( 2nd )

这两个2nd 也是三元的,这对第一个的过程没有影响。

【讨论】:

    【解决方案2】:

    在 C 的传统中,三元运算符并不是真正的 var ? var : var。其实是这样的:

    statement ? statement : statement
    

    这意味着,您可以将代码放入其中进行评估,而不是变量或值,并将该代码的返回值作为值。所以,

    (i%3)?(i%5)?i:'Buzz':(i%5)?'Fizz':'FizzBuzz'
    

    分解为:

    (i%3) ?
             (i%5) ?
                      i
                   :
                      'Buzz'
          :
             (i%5) ?
                      'Fizz'
                   :
                      'FizzBuzz'
    

    (基本上是你在问题中写的,所以你的解释是正确的)

    它有助于将: 放在单独的行中,这样您就可以看到模式。我还将?: 对齐,以查看哪个与哪个分组。

    【讨论】:

    • 恕我直言,写在一行中的嵌套三元运算符是邪恶的。
    • condition ? true_statement : false_statement; 会更语义化。
    • condition_statement 因为条件本身可以是一个语句。但是,我假设 OP 已经理解语法是 cond?true:false 我省略了语义以澄清大多数人对数据三元运算符实际操作的误解。
    猜你喜欢
    • 2021-11-08
    • 2018-08-31
    • 2010-10-02
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多