2013-09-06 7 views
12

!!xは、その真実性またはその欠如を維持しながら、変数xのタイプをブール値に強制します。see this question - これを条件式で使用することについて質問があります。なぜ使用するのですか?条件式で使うために変数をbooleanに強制する?

私はアイデアがxが上のメソッドを呼び出す前に定義されているかどうかをテストすることですので、

if(!!x) { 
    x.doStuff(); 
} 

ようif状態でboolean型に変数を強制するために使用さ!!を見てきたJSコードで数回それ。

しかし、私自身のコードで私はいつもちょうどxが定義されている場合、条件が通過し、xが定義されていない場合、それは通過しないことを前提

if(x) { 
    x.doStuff(); 
} 

を使用しました。

私の質問はですこのシナリオでは、xにブール値を強制する点は何ですか?this codeとは何ですか?this codeはありませんか?

私はそれはクールに見えるので、他のプログラマはそれを使用していないので、

+1

いいえ、私はその質問にリンクして答えを理解しています。このシナリオでは、タイプをブール値に強制する点が何であるかを尋ねています - 重複としてフラグを立てる前に質問をお読みください! – davnicwil

+2

答えはそれをすることに意味がないということです。あなたが '!!'を中断した場合と全く同じです。 – user2736012

+1

確かに。プログラミングを学んでいる間、人々はあらゆる種類の迷信をします。 –

答えて

11

、私は明示的!!を使用してブールまたはif式が自然ブーリアンに変換させる変換の間に差がないことを言います。つまり、if (x)if (Boolean(x))と解釈され、if (!!x)と同じです。

あなたがarrayHasItems機能を実装したい場合は、あなたは、例えば、関数から値を返すしている場合、あなたはそれをこのように実現することができます。

function arrayHasItems(arr) { 
    return arr.length; 
} 

機能を使用してif文であるとして、関数から返された数値がブール値に変換されるために機能します。しかし、クライアントコードは、関数がブール値を返すことを期待ので、彼は実行して状態を確認されることがあります。arrayHasItemsから返された結果が多数あったので、この場合は

if (arrayHasItems(arr) === true) {} 

を、それは失敗します。 したがって、期待どおりのブール値を返すことで関数を実装する方が良いでしょう。

function arrayHasItems(arr) { 
    return !!arr.length; 
} 

EDIT:

これは、新しい質問が表示されます:!! arr.lengthだけでなく、 arr.lengthは> 0

の間に違いがありisin't理由両方の結果が同じ量の文字を使用するため、結果が生成され、バイトを保存していません。しかし、私はtest caseを作成したが、二重否定はより良く実行されるようだが、すべてのブラウザで一貫していない可能性がある。

+1

これは新しい質問を引き起こします:なぜ '!! arr.length'だけでなく' arr.length> 0'ですか? – BalusC

+0

@BalusC、私は答えを更新しました、二重否定はより良い実行するようです。 – plalx

0

としては、それはブール値に値を変換し、記載された本や私の他の仮定の1つのいずれかが間違って:-)であると仮定していますしたがって、if(x)とあまり変わりません。しかし、それはまた0falseに変換するので、どちらも難しいです。

+3

私はあなたの例題が質問と何か関係があるのか​​分かりません。 – smerny

+0

'if(myValue!== null && myValue!== undefined)'は 'if(myValue){}'と同じではありません –

+0

いいえ、例を削除しました。私がしようとしている点は、 'if(x)'か 'if(!! x)'をチェックするだけでヌルチェックをしないということです。 –

0

これはJavaScriptの種類の制限と関係があります。

あなたは条件が等しくなりたい場合は多くの場合、あなたは、それをチェックする一般的な方法は、しかし

if (obj) { 
    ... 
} 

あるオブジェクトがnullでない場合、未定義ではない、ない0、などを確認したいですtrueまたはfalse!は、ブール値のないオブジェクトインスタンスで使用できます。ここでは型の一致を行わない等価演算子===を使用する例を示します。その特定の文脈において

var obj = {}; 

console.log(obj === true); // returns false 
console.log(!obj === false); // returns true 
console.log(!!obj === true); // returns true 
関連する問題