关于JavaScript三元运算的疑问:toto(4,6)为何返回true?
这问题核心是没搞清楚三元运算符的执行逻辑和JavaScript运算符优先级,咱们一步步拆解你的代码,就能明白为啥toto(4,6)返回true了。
先看你的函数返回的核心表达式:
x > 0 ? x < 7 ? true : false : false && y > 0 ? y < 6 ? true : false : false
第一个关键:运算符优先级
JavaScript里,逻辑与&&的优先级高于三元运算符?:,所以表达式里的false && y > 0会被优先计算——因为&&左边是false,不管y>0结果是什么,这部分整体结果都是false(短路求值,右边根本不会运行)。
第二个关键:三元运算符的执行逻辑与右结合性
三元运算符是右结合的,而且具有短路特性:只要判断出test条件的真假,只会执行对应分支的表达式,另一分支完全不会被求值。
现在代入x=4,y=6一步步走:
- 先判断
x>0:4>0 →true,所以直接进入第一个三元的true分支:x <7 ? true : false,后面的: false && ...部分直接被忽略,根本不会执行。 - 接着判断
x<7:4<7 →true,所以这个嵌套三元返回true,整个表达式的结果就是true。
你之前误以为会触发y相关的判断,但实际上当x满足0<x<7时,代码已经直接返回true了,和y的值完全没关系。
补充:你的代码等价于什么
如果给表达式加上明确的括号(按照优先级和结合性),逻辑会更清晰:
x > 0 ? (x < 7 ? true : false) : ((false && y > 0) ? (y < 6 ? true : false) : false)
优化建议
嵌套三元虽然简洁,但可读性很差,容易踩优先级的坑。你可以把逻辑改成更直观的写法:
function toto(x, y) { return (x > 0 && x < 7) || (y > 0 && y < 6); }
或者用更易懂的if-else:
function toto(x, y) { if (x > 0 && x < 7) { return true; } if (y > 0 && y < 6) { return true; } return false; }
这样逻辑一目了然,也不容易出错。
内容的提问来源于stack exchange,提问作者Crocsx
相关产品推荐
相关产品推荐

