var a;
var b=!!a;
a預設是undefined。 !a是true,!!a則是false,所以b的值是false,而不再是undefined,也非其它值,主要是為後續判斷提供便利。
!!一般用來將後面的表達式強制轉換為布林類型的資料(boolean),也就是只能是true或false;
因為javascript是弱型別的語言(變數沒有固定的資料型別)所以有時需要強制轉換為對應的類型,類似的如:
a=parseInt(“1234″)
a=”1234″-0 //轉換為數字
b=1234+”" //轉換為字元字串
c=someObject.toString() //將物件轉換為字串
其中第1種、第4種為明確轉換,2、3為隱式轉換
布林型的轉換,javascript約定規則為
false、undefinded、null、0、”" 為false
true、1、”somestring”、[Object] 為true
對null與undefined等其他用隱式轉換的值,用操作符時都會產生true的結果,所以用兩個感嘆號的作用就在於將這些值轉換為「等價」的布林值;
====================== ==================================================== =======================================
先用一個簡單的例子說明:
var o={flag:true};
var test=!!o.flag;//等效於var test=o.flag||false;
alert(test);
由於對null與undefined用!操作符時都會產生true的結果,所以用兩個感嘆號的作用就在於,如果明確設定了o中flag的值(非null/undefined/0""/等值),自然test就會取跟o.flag一樣的值;如果沒有設置,test就會預設為false,而不是null或undefined。
在jQuery中比較經典的例子如下:(jQuery 1.7.0.js: Line 748)
grep: function( elems, callback, inv ) {
var ret = [], retVal;
inv = !!
// that pass the validator function
for ( var i = 0, length = elems.length; i retValback = !call i ], i );
if ( inv !== retVal ) {
ret.push( elems[ i ] );
}
}
}
在使用grep函數的時候,如果給了第三個參數且非null/undefined/0""/等值,則inv為true,否則為false。這樣做的目的是確保inv和retVal的值都只能在true/false中取,而非其它值,為後續判斷提供便利。