2015-05-03 99 views
4
function bouncer(arr) { 
    // Don't show a false ID to this bouncer. 
    function a(b) { 
     if(b !== false) { 
     return b; 
     } 
    } 

    arr = arr.filter(a); 
    return arr; 
} 

bouncer([7, 'ate', '', false, 9]); 

我必須只返回true布爾語句,並且當我運行此代碼時,它可以工作。但是,我很困惑,因爲我的「if語句」將起作用,無論它是b!== true還是b!== false。有人能解釋爲什麼這兩種方式的原因?javascript .filter()true布爾值

回答

1

您的函數行爲是因爲布爾比較中的JavaScript值是「真」或「假」。在布爾上下文中使用時,非布爾值被強制爲布爾值(比較,如果報表等)

如果我理解你的意圖,你可以修改你的功能,讓您期望的輸出是這樣的:

function bouncer(arr) { 
    // Don't show a false ID to this bouncer. 
    function a(b) { 
     if(typeof(b) === 'boolean' && !b) { 
     return new Boolean(b); 
     } 
    } 

    arr = arr.filter(a); 
    return arr; 
} 

bouncer([7, 'ate', '', false, 9, true]); 
2

這是因爲你返回的價值。過濾函數返回true或false這樣的:

function bouncer(arr) { 
    arr = arr.filter(function(x) { console.log(x === true) 
     if(x !== false) { 
      return true; 
     } 
    }); 
    return arr; 
} 

或更短:

function bouncer(arr) { 
    return arr.filter(function(x) { console.log(x === true) 
     return x !== false; 
    }); 
} 
9

我是解決類似的問題以及與此

function bouncer(arr) { 
    return arr.filter(Boolean); 
} 
bouncer([7, 'ate', '', false, 9]); 
// returns ['7','ate','9'] 

我知道後上來是老,哈哈。

0

最簡單的方式做到這一點:

function bouncer(arr) { 
    return arr.filter(x => !!x); 
} 
+1

使用'arr.filter(布爾)'更簡單 –