var b=!!a;
a默認是undefined。!a是true,!!a則是false,所以b的值是false,而不再是undefined,也非其它值,主要是為后續(xù)判斷提供便利。
!!一般用來將后面的表達式強制轉(zhuǎn)換為布爾類型的數(shù)據(jù)(boolean),也就是只能是true或者false;
因為javascript是弱類型的語言(變量沒有固定的數(shù)據(jù)類型)所以有時需要強制轉(zhuǎn)換為相應(yīng)的類型,類似的如:
a=parseInt(“1234″)
a=”1234″-0 //轉(zhuǎn)換為數(shù)字
b=1234+”" //轉(zhuǎn)換為字符串
c=someObject.toString() //將對象轉(zhuǎn)換為字符串
其中第1種、第4種為顯式轉(zhuǎn)換,2、3為隱式轉(zhuǎn)換
布爾型的轉(zhuǎn)換,javascript約定規(guī)則為
false、undefinded、null、0、”" 為 false
true、1、”somestring”、[Object] 為 true
對null與undefined等其他用隱式轉(zhuǎn)換的值,用!操作符時都會產(chǎn)生true的結(jié)果,所以用兩個感嘆號的作用就在于將這些值轉(zhuǎn)換為“等價”的布爾值;
=============================================================================================================
先用一個簡單的例子說明:
var o={flag:true};
var test=!!o.flag;//等效于var test=o.flag||false;
alert(test);
由于對null與undefined用!操作符時都會產(chǎn)生true的結(jié)果,所以用兩個感嘆號的作用就在于,如果明確設(shè)置了o中flag的值(非null/undefined/0""/等值),自然test就會取跟o.flag一樣的值;如果沒有設(shè)置,test就會默認為false,而不是null或undefined。
在jQuery中比較經(jīng)典的例子如下:(jQuery 1.7.0.js: Line 748)
grep: function( elems, callback, inv ) {
var ret = [], retVal;
inv = !!inv;
// Go through the array, only saving the items
// that pass the validator function
for ( var i = 0, length = elems.length; i < length; i++ ) {
retVal = !!callback( elems[ i ], i );
if ( inv !== retVal ) {
ret.push( elems[ i ] );
}
}
return ret;
}
在使用grep函數(shù)的時候,如果給出了第三個參數(shù)且非null/undefined/0""/等值,則inv為true,否則為false。這樣做的目的就是保證inv和retVal的值都只能在true/false中取,而非其它值,為后續(xù)判斷提供便利。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com