假設
val
已經聲明,可定義爲任何值。則下面js代碼有可能輸出的結果爲:javascript
console.log('Value is ' + (val != '0') ? 'define' : 'undefine');
A. Value is define
B. Value is undefine
C. define
D. undefine
E. Value is define 或者 Value is undefine
F. define 或者 undefine
G. 其它選項都有可能java
若是是你,你會選什麼呢?spa
能夠說,大部分人都會在A、B、E中選擇,覺得重點在後面的三目運算符,前面字符串原樣輸出就是了。可是答案是 C 。code
由於咱們忽略了運算符的優先級。要知道,加號 +
優先級高於三目運算 ? :
,低於括號 ()
。無論 (val != '0')
的真假,'Value is ' + (val != '0')
是一個字符串而且轉換成布爾值必定是 true
!對象
下面咱們來具體分析裏面的每一部分。blog
先來看看括號裏面的狀況,題目已經說了:ip
假設
val
已經聲明,可定義爲任何值。字符串
因此,(val != '0')
的值能夠是 true
或者 false
,那麼這個就涉及到JavaScript的一些隱式轉換邏輯。it
衆所周知,console
0 == '0' // true null == undefined // true false == '0' // true
x+"" //等價於String(x) +x //等價於Number(x),也能夠寫成x-0 !!x //等價於Boolean(x)
回到本題條件永遠爲真,而且只輸出 'define'
還有一個須要注意的地方
下面程序的顯示結果是?
var x = new Boolean(false); if (x) { alert('hi'); } var y = Boolean(0); if (y) { alert('hello'); }
x爲Boolean對象,在if語句裏的判斷爲true,雖然x的值爲false,可是做爲對象,if會直接判斷爲true。y爲Boolean值,在if裏的判斷就是false值。因此會顯示 'hi'
。