两个三元运算符嵌套优先执行嵌套内的吗?

num = (num < 10) ? ( (num<0)?(num+=24):(num="0"+num) ) : (num)

就是这个,会先进行24小时时区判断,然后再判断是否小于10码?验证后是这样的,但以前没遇到过,特来求解

阅读 12.3k
5 个回答
num = (1 < 10) ? ( (1<0)?1:2 ) : 3
2
num = (11 < 10) ? ( (1<0)?1:2 ) : 3
3
num = (1 < 10) ? ( (1<10)?1:2 ) : 3
1

没毛病啊,先算问号左边,(num < 10)
如果为真,则接(num<0)?(num+=24):(num="0"+num)
为假则接(num)

直接打开 console 试试看就知道了,应该是别的地方疏忽了。
突然想到,其实你要说是先算嵌套的,其实结果不会变的,所以无法验证。
因为如果(num < 10)为假,则必然无视嵌套,
如果(num < 10)为真,则运行嵌套的内容,那么得出嵌套内容的结果,无论先后都是一样。

再加上符合你题目要求的类似测试:

num=11
11
num = (num < 10) ? ( (num<100)?(num-=2):(num="0"+num) ) : (num)

11

如果说先执行嵌套内容,则程序就会出现死循环,而不会返回 num 即 11 了。
所以是从左到右的。

MDN, 条件运算符的优先级是从右向左,因此会从最右侧算起,如果最右侧有嵌套,会从嵌套内的最右侧算起
比如x = 1 > 2 ? 3 : 4 > 5 ? 6 : 7,先算4 > 5 ? 6 : 7为7, 再算1 > 2 ? 3 : 7,最终结果为7

x = 1 < 2 ? 4 > 5 ? 6 : 7 : 3 同理,最好带括号,结构清晰些,也不易出错。

相当于:

if (num < 10) { // 当然是num < 10 先啊
  if (num < 0) {
    return num+=24
  } else {
    return '0' + num
  }
} else {
  return num
}

先执行最外面的if条件;在依次往里面推进判断计算结果了。

这个三元操作符是右结合的,也就是说你可以像这样把它链接起来, 和if … else if … else if … else链类似:

function example(…) {
    return condition1 ? value1
         : condition2 ? value2
         : condition3 ? value3
         : value4;
}

// Equivalent to:

function example(…) {
    if (condition1) { return value1; }
    else if (condition2) { return value2; }
    else if (condition3) { return value3; }
    else { return value4; }
}

条件运算符

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题