1. 程式人生 > >使用JavaScript時在變數前加2個感嘆號意義

使用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會自動轉換,!!就只應用於將型別轉換為布林值。