最近接手一個項目,然後收到一個 bug 說是每次接口返回的數據都是上一次的舊數據,所以我對當前項目的接口配置文件進行了排查。
經過我精心的排查,最後發現了一段可疑代碼,大概長這樣:
'12345' || '67890' ? '67890' : ''
這段代碼乍一看下,應該返回:12345
,可是實際上,返回的確是:67890
。
代碼作者的思路我認爲是:
- 首先判斷
12345
是否存在,如果存在,則直接返回12345
'12345'
'67890' ? '67890' : ''
- 如果不存在,則進入右側的三元運算符
'67890' ? '67890' : ''
'67890' ? '67890' : ''
- 如果
67890
存在,則返回67890
,否則返回`’’
但是如上代碼的實際工作方式爲:
- 首先判斷
12345
和67890
,如果12345
存在的情況下,返回12345
,否則返回67890
,所以假設以下兩者都爲 true 的情況下,都返回12345
'12345' || '67890'
- 然後判斷
12345
是否爲 true,如果爲 true 的話,返回67890
,否則返回''
'12345' ? '67890' : ''
所以,如果我們預期 12345
爲 true 的話,則直接返回,但其實 12345
爲 true,返回的確是 67890
。
那麼解決辦法很簡單,加個括號即可:
'12345' || ('67890' ? '67890' : '')
總結: 可以得出結論, 邏輯或 優先級大於 三元運算符。