JavaScript中一個運算符優先級問題引起的思考

JavaScript中一個運算符優先級問題引起的思考

題目

假設 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中選擇,覺得重點在後面的三目運算符,前面字符串原樣輸出就是了。可是答案是 Ccode


分析

由於咱們忽略了運算符的優先級。要知道,加號 + 優先級高於三目運算 ? :,低於括號 ()。無論 (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)

附錄 - Javascript類型轉換

Javascript類型轉換

回到本題條件永遠爲真,而且只輸出 'define'

Boolean

還有一個須要注意的地方

下面程序的顯示結果是?

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'

相關文章
相關標籤/搜索