2017-08-24 26 views
-2

我真的很困惑。也許任何人都可以幫助我? 的問題如下:布爾對象在條件下無法正常工作

var isSignInside = new Boolean(someCondition); 

if (!isSignInside) { 
    //doStuff 
} 
else { 
    //doOtherStuff 
} 

現在,如果isSignInsidefalse(調試器告訴我的),腳本仍然跳轉到//doOtherStuff。怎麼會這樣? 該片段的其餘部分不具有針對性,但如果提問,我可以分享。 當然有一個簡單的解釋,我不明白。提前致謝。 編輯: someCondition真的是一個自定義的方法「強制」返回一個布爾,而不是(否則)一個字符串。 編輯:只是直接在if中使用函數。需要一些棘手的假設,但現在起作用。感謝提示,一個(布爾)對象不能===靜態布爾原語。地獄這個論壇很快。

+1

'如果{// doStuff}其他{// doOtherStuff}'' – Erazihel

+0

新布爾()'創建對象和對象總是會是真的。你只需要直接檢查你的情況。 '如果(!someCondition)' – Keith

+2

在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean第一個示例describies的正是這種情況。 –

回答

4

當您創建一個布爾對象時,它是一個對象。無論其表示的布爾基元值是什麼,它的引用都會像其他任何非空對象引用一樣被測試爲真。

通常有一個在構造一個Boolean實例一樣,沒有一點:

var isSignInside = !!someCondition; 

這會給你一個布爾值基本反映您的病情truthy/falsy狀態。

+1

如果你解釋瞭如何使代碼工作,除了解釋爲什麼不行,你的答案會更好。 –

+0

這是正確的答案,但你可能要擴大它,以便OP可以理解 – Damon

+0

@BryanOakley做 – Pointy

2

其實,isSignedInside不是一個布爾值,而是一個Boolean對象(感謝)。你可能想要得到它的原始值進行比較:

if((new Boolean(false)).valueOf()) alert("hehe"); 

甚至更​​容易,直接取值。

+1

從可視化調試器相同的概念:http://imgur.com/a/ zRbUb – Xaqron

1

那麼這不是這樣做的。你想使用一個布爾原語。你正在試圖做的是做這樣的:(!someCondition)

var isSignInside = (someCondition); 
if (isSignInside === false) { 
    //doStuff 
} 
else { 
    //doOtherStuff 
} 

https://jsfiddle.net/catbadger/pxrteq59/

+0

號否定它可能是更好然後全等假 –

+0

That's點。正如我剛剛學到的'!(new Boolean(false))'確實評估爲false。 –

+0

@Jonasw捍衛你發言。否定是不明確的 – catbadger