这个JavaScript三元运算符是如何工作的

时间:2012-11-23 03:32:12

标签: javascript conditional ternary-operator

感恩节快乐:

我一直在围绕这一个人绞尽脑汁半小时,并且无法完全摆脱条件限制所在。我想我已经把它弄下来,但只是想由专业人员来管理它。 / p>

(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);
        }
    }

我假设三元运算符按以下方式分组(我习惯于在典型的结果中看到三元运算符?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

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

2 个答案:

答案 0 :(得分:3)

三元运算符具有right-to-left associativity,这意味着表达式与

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

或者它以下列方式崩溃

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

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

答案 1 :(得分:1)

在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'

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

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