JavaScript 逻辑或 和 三元运算符 运算符优先级 导致的 bug

最近接手一个项目,然后收到一个 bug 说是每次接口返回的数据都是上一次的旧数据,所以我对当前项目的接口配置文件进行了排查。

经过我精心的排查,最后发现了一段可疑代码,大概长这样:

'12345' || '67890' ? '67890' : ''

这段代码乍一看下,应该返回:12345,可是实际上,返回的确是:67890

代码作者的思路我认为是:

  • 首先判断 12345 是否存在,如果存在,则直接返回 12345
'12345' 
'67890' ? '67890' : ''
  • 如果不存在,则进入右侧的三元运算符 '67890' ? '67890' : ''
'67890' ? '67890' : ''
  • 如果67890存在,则返回67890,否则返回`’’

但是如上代码的实际工作方式为:

  • 首先判断 1234567890 ,如果 12345 存在的情况下,返回 12345,否则返回 67890,所以假设以下两者都为 true 的情况下,都返回 12345
'12345' || '67890'
  • 然后判断 12345是否为 true,如果为 true 的话,返回 67890,否则返回''
'12345' ? '67890' : ''

所以,如果我们预期 12345 为 true 的话,则直接返回,但其实 12345为 true,返回的确是 67890

那么解决办法很简单,加个括号即可:

'12345' || ('67890' ? '67890' : '')

总结: 可以得出结论, 逻辑或 优先级大于 三元运算符

你可能感兴趣的:(javascript)