使用JavaScript時在變數前加2個感嘆號意義
使用JavaScript時,有時會在變數前面加上兩個感嘆號,這樣做表示什麼含義呢?javascript中,!表示運算子“非”,如果變數不是布林型別,會將變數自動轉化為布林型別,再取非,那麼用兩個!!就可以將變數轉化為對應布林值。
Javascript中哪些情況下!!值為真?
Javascript中哪些情況下!!值為真?當變數轉化為布林值true時為真咯!
Javascript中各種型別如何轉換為布林值?
我們至少可以想到undifined和null一定是轉化為false的,數字0也一定是false,那麼,空字串,空陣列,空物件呢?別急,下面的實驗會有清晰的答案。
首先,定義三個轉化布林值的函式,我們後面會看到這三個函式是等價的,並且同時輸出三個函式的轉化結果
function trueOrFalseIf(toTest){ if(toTest){ return true; } else{ return false; } } function trueOrFalseDouble(toTest){ return !!toTest; } function trueOrFalseBoolean(toTest){ return new Boolean(toTest); } function print(toTest){ document.write(trueOrFalseIf(toTest)+","+trueOrFalseDouble(toTest)+","+trueOrFalseBoolean(toTest)+"<br/>"); }
依次測試undefined,null,空字串,負0,正0,不確定數值,布林值false,布林值true,字串0,數字1,數字無窮大,字串true,字串false,空陣列,空物件,函式
function test(){ var toTestArray=[undefined,null,"",-0,0,NaN,false ,true,"0",1,Infinity,"true","false",[],{},function(){}]; for(var i=0;i<toTestArray.length;i++){ print(toTestArray[i]); } }
測試結果如下:
false,false,false
false,false,false
false,false,false
false,false,false
false,false,false
false,false,false
false,false,false
true,true,true
true,true,true
true,true,true
true,true,true
true,true,true
true,true,true
true,true,true
true,true,true
true,true,true
可以看到前面7個值都是false,後面9個值都是true。比較值得一提的結論如下:
眾望所歸,undefined和null為false。
任意陣列,物件,函式(函式是特殊的物件)都轉化為真,即使是空陣列,空物件。
空字串為false,非空字串為true。
數值正負0,不確定值為false,其它為true,無窮大也是true。
字串”0″和數值0可以相互轉換,但它們轉換為不同的布林值,即0可轉換為”0″,”0″可轉換為true,但0卻轉換為false,可見Javascript中型別轉換不具有傳遞性。
一個更有趣的現象是布林值false會轉化為字串”false”,而字串”false”卻轉換為布林值true。
document.write(new String(false)); document.write(new Boolean("false"));
結果為
falsetrue
回到我們的題目,Javascript中!!(兩個感嘆號,雙感嘆號)可以用來做什麼,可以用來判斷一些變數的值啊!如果值為真,首先可以排除undefined和null,根據物件型別,可以做出如下判斷:
數值:表示不是0,且有確定含義的值(包括無窮大)
字串:表示長度大於0的字串
陣列,物件,函式:只能表示不是undefined或null,並不能判斷是否有元素和內容。
另外,我們上面比較了三個函式,結果是一樣的,所以下面兩個用法其實是完全等價的:
if(!!value){ } if(value){ }
如果作為條件表示式,不需要使用!!進行轉換,Javascript會自動轉換,!!就只應用於將型別轉換為布林值。