num = (num < 10) ? ( (num<0)?(num+=24):(num="0"+num) ) : (num)
就是这个,会先进行24小时时区判断,然后再判断是否小于10码?验证后是这样的,但以前没遇到过,特来求解
num = (num < 10) ? ( (num<0)?(num+=24):(num="0"+num) ) : (num)
就是这个,会先进行24小时时区判断,然后再判断是否小于10码?验证后是这样的,但以前没遇到过,特来求解
按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 … 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; }
}
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
没毛病啊,先算问号左边,(num < 10)
如果为真,则接(num<0)?(num+=24):(num="0"+num)
为假则接(num)
直接打开 console 试试看就知道了,应该是别的地方疏忽了。
突然想到,其实你要说是先算嵌套的,其实结果不会变的,所以无法验证。
因为如果(num < 10)为假,则必然无视嵌套,
如果(num < 10)为真,则运行嵌套的内容,那么得出嵌套内容的结果,无论先后都是一样。
再加上符合你题目要求的类似测试:
如果说先执行嵌套内容,则程序就会出现死循环,而不会返回 num 即 11 了。
所以是从左到右的。