2012-10-29 31 views
0

你好同胞JS癮君子。有人可以向我解釋評估變量真實性的下列方法之間的區別嗎?JavaScript-用於評估真/假值的方法的差異

var q1Var1 = "hello", 
     q1Var2 = 0, 
     q1Var3 = true, 
     q1Var4 = "false", 
     q1Var5 = -1, 
     q1Var6 = undefined, 
     q1Var7 = null, 
     q1Var8; 

// What is the difference between this block of code: 

console.log(!q1Var1); 
console.log(!q1Var2); 
console.log(!q1Var3); 
console.log(!q1Var4); 
console.log(!q1Var5); 
console.log(!q1Var6); 
console.log(!q1Var7); 
console.log(!q1Var8); 

// and this block? 

if(q1Var1 === true){ console.log("true") } else { console.log("false") }; 
if(q1Var2 === true){ console.log("true") } else { console.log("false") }; 
if(q1Var3 === true){ console.log("true") } else { console.log("false") }; 
if(q1Var4 === true){ console.log("true") } else { console.log("false") }; 
if(q1Var5 === true){ console.log("true") } else { console.log("false") }; 
if(q1Var6 === true){ console.log("true") } else { console.log("false") }; 
if(q1Var7 === true){ console.log("true") } else { console.log("false") }; 
if(q1Var8 === true){ console.log("true") } else { console.log("false") }; 

我期待發現第二塊也只是的第一個(換句話說,值也只是切換),然而,它看起來像只變量集到非字符串「真」的逆實際上返回true。爲什麼是這樣?兩者有什麼評價之間的根本區別:

!q1Var1 

vs. 

true === q1Var1 
+1

請參閱http://stackoverflow.com/questions/359494/javascript-vs-does-it-matter-which-equal-operator-i-use - 做'!q1Var1'與測試' q1Var1 == false'然後只看==和=== – dievardump

+0

之間的區別請參閱http://stackoverflow.com/questions/5515310/is-there-a-standard-function-to-check-for-null-undefined -or-blank-variables-in/5515349#5515349 – jAndy

+0

dievardump - 感謝這是更多沿着我正在尋找的林...測試現在。 – gogogadgetinternet

回答

6

這說明了"falsy" values在JavaScript中的概念。例如,undefined在布爾上下文中變得與false相同(例如if條件)。但是,undefined === false而不是是true。以下是所有的 「falsy」 值:

  • false
  • undefined
  • 空字符串
  • 數0
  • null
  • NaN

===運營商意味着「嚴格相等」(例如見here);它抑制了自動類型轉換。

==操作者(從上面的第二鏈路)類型轉換規則是:

如果兩個操作數不是同一類型的,JavaScript的轉換操作數然後應用嚴格比較。如果任一操作數是的數字或布爾值,則操作數將盡可能轉換爲數字;否則如果任一操作數是一個字符串,則另一個操作數在可能的情況下轉換爲字符串。如果這兩個操作數都是對象,那麼當操作數引用內存中的同一對象時,JavaScript會比較內部引用相等。

嚴格比較規則是:

  • 兩個字符串嚴格相等時,他們有字符,相同的長度,和相同的字符相同的序列中的相應位置
  • 兩個數字嚴格相等時,他們在數值上相等(具有相同的數值)。 NaN不等於任何東西,包括NaN。正,負零點彼此相等
  • 兩個布爾操作數嚴格相等,如果都爲真或兩個都是假的
  • 兩個對象是永遠相等要麼嚴格的或抽象的比較
  • 比較對象表達式是唯一的真如果操作數引用同一個對象
  • null和undefined類型==(但不是===),特別是

注意!var是不一樣的var == false(當然不是爲相同如果var不是開始的布爾值,則爲210)。非空字符串爲「truthy」(!"..."對於任何非空"..."總是false),但在轉換爲數字(如"0")時評估爲0的非空字符串爲== false

+3

需要更多的內容,或許可以解釋'==='非鑄造的比較。 – TheZ

+0

@TheZ - 我到了那裏。 :) –

+0

+1確實!爲了便於閱讀,有一點空白,你已經得到了一個很好的答案。 – TheZ

0

===運營商可能有點混亂,有時過度使用。在使用===運營商時,請務必記住它比較類型和價值。因此,當這樣的語句用於:

if(q1Var1 === true) 

它要求q1Var1是相同類型和true價值。如果情況是設置這樣的:

q1Var1 = 1; 
if (q1Var1 === true) { console.log(true); } else { console.log(false); }//false 

然後控制檯將記錄false因爲1是不一樣的類型和值true

但是,使用==操作符,控制檯將記錄true,因爲1true的值相同。

這可以與被觀察:

if (1 == true) { console.log(true); } else { console.log(false); }//true 
if (1 && true) { console.log(true); } else { console.log(false); }//true 

在另一端,

if(!q1Var1); 

測試如果q1Var1是0。值得注意的是,因爲false也在值等於0(但仍然無法在類型),

if (0 && false) { console.log(true); } else { console.log(false); }//true (same value) 
if (0 == false) { console.log(true); } else { console.log(false); }//true (same value) 
if (0 === false) { console.log(true); } else { console.log(false); }//false (same value, different type) 

這個測試可以是真實的數字以及布爾值因爲沒有類型的測試。

if (!0) { console.log(true); } else { console.log(false); }//true 
if (!false) { console.log(true); } else { console.log(false); }//true 
0

當我們有一個操作的第一個值的2個不同的操作數的解釋(類型變換)sholuld進行返回結果在所述第二操作數的類型和被稱爲type cast。在條件方程中,結果是boolean類型,所以結果總是被輸出到boolean,所以回到你的問題,所有這些例子都是cast不同類型到boolean。在javascript中自動進行轉換,但在某些語言中,尤其是在使用strict語法時,您應該自己指定轉換,否則您的日誌將充滿錯誤。

0

據我所知,第二組測試(q1Var1 ===真)正在尋找絕對平等。它不會默認爲真實,因爲它正在尋找完美的匹配。

鑑於第一套,我對這一點有點模糊,我認爲是測試一個對象,因爲測試沒有上下文...至少,我認爲這就是發生了什麼.. .oo