仕事の半分を行うのに、多くの答えがあります。はい、!!X
「Xの真実[ブール値として表される]」と読むことができます。しかし!!
、実際には、単一の変数が真実であるか偽であるかを判断するためにそれほど重要ではありません。!!myVar === true
と同じmyVar
です。比較する!!X
「実際の」ブール値しても、あまり役に立ちません。
あなたが得るもの!!
は、複数の変数の真実性をお互いに対してチェックする能力です、繰り返し可能な標準化された(そしてJSLintフレンドリーな)方法で、しです。
単にキャストする:(
あれは...
0 === false
ですfalse
。
!!0 === false
ですtrue
。
上記はあまり役に立ちません。if (!0)
と同じ結果が得られif (!!0 === false)
ます。変数をブール値にキャストし、「真の」ブール値と比較する良いケースは考えられません。
JSLintの指示から「==と!=」を参照してください(注:Crockfordはサイトを少し動かしています。そのリンクはいつか死ぬ可能性があります)。その理由について少し説明します。
==および!=演算子は、比較する前に型強制を行います。これは '\ t \ r \ n' == 0がtrueになるので悪いです。これにより、タイプエラーがマスクされる可能性があります。JSLintは==が正しく使用されているかどうかを確実に判断できないため、==および!=をまったく使用せず、代わりに常により信頼性の高い===および!==演算子を使用することをお勧めします。
値が真実か偽物かだけを気にする場合は、短い形式を使用します。の代わりに
(foo != 0)
言うだけ
(foo)
代わりに
(foo == 0)
いう
(!foo)
ブール値が数値にキャストされるいくつかの直感的でないケースがあることに注意してください(true
にキャストされた1
とfalse
の0
数にブール値を比較する場合)。この場合、!!
精神的に役立つかもしれません。繰り返しますが、これらは非ブール値をハードタイプのブール値と比較する場合です。つまり、深刻な間違いです。 if (-1)
まだここに行く方法です。
╔═══════════════════════════════════════╦═══════════════════╦═══════════╗
║ Original ║ Equivalent ║ Result ║
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (-1 == true) console.log("spam") ║ if (-1 == 1) ║ undefined ║
║ if (-1 == false) console.log("spam") ║ if (-1 == 0) ║ undefined ║
║ Order doesn't matter... ║ ║ ║
║ if (true == -1) console.log("spam") ║ if (1 == -1) ║ undefined ║
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (!!-1 == true) console.log("spam") ║ if (true == true) ║ spam ║ better
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (-1) console.log("spam") ║ if (truthy) ║ spam ║ still best
╚═══════════════════════════════════════╩═══════════════════╩═══════════╝
そして、あなたのエンジン次第では物事はさらにクレイジーになります。たとえば、WScriptが受賞しました。
function test()
{
return (1 === 1);
}
WScript.echo(test());
歴史的なWindows jiveがあるため、メッセージボックスに-1が出力されます。cmd.exeプロンプトで試してみてください。しかし、WScript.echo(-1 == test())
それでも0またはWScriptのが与えられますfalse
。目をそらす。それは恐ろしいです。
真実の比較:)
しかし、もし私が2つの値を持っている場合、等しい真実性/偽り性をチェックする必要がありますか?
私たちが持っているふり myVar1 = 0;
してmyVar2 = undefined;
。
myVar1 === myVar2
であり0 === undefined
、明らかに誤りです。
!!myVar1 === !!myVar2
です !!0 === !!undefined
、本当です!同じ真実!(この場合、どちらも「偽りの真実性を持っている」)。
したがって、「boolean-cast変数」を実際に使用する必要がある唯一の場所は、両方の変数が同じ真実性を持っているかどうかを確認している状況である場合でしょう。つまり、2つの変数が両方とも真実であるか、両方とも偽である(またはそうでない)か、つまり等しいかどうかを確認する必要がある場合に使用し!!
ます。(またはしない)truthiness。
私はその手抜きのための素晴らしい、不自然でない使用例を考えることができません。フォームに「リンクされた」フィールドがあるのでしょうか。
if (!!customerInput.spouseName !== !!customerInput.spouseAge ) {
errorObjects.spouse = "Please either enter a valid name AND age "
+ "for your spouse or leave all spouse fields blank.";
}
だから、もしあなたが両方に真実を持っているなら、、配偶者の名前と年齢の両方で、あなたは続けることができます。それ以外の場合は、値(またはごく初期に調整された結婚)を持つフィールドが1つだけあり、errorObjects
コレクションに追加のエラーを作成する必要があります。
編集2017年10月24日、2月19日:
明示的なブール値を期待するサードパーティライブラリ
ここに興味深いケースがあります... !!
サードパーティのライブラリが明示的なブール値を期待している場合に役立つかもしれません。
たとえば、JSX(React)のFalseには、単純な偽造ではトリガーされない特別な意味があります。JSXで次のようなものを返そうとした場合、intが期待されmessageCount
ます...
{messageCount && <div>You have messages!</div>}
... 0
メッセージがゼロのときにReactがを表示することに驚かれるかもしれません。JSXがレンダリングされないようにするには、明示的にfalseを返す必要があります。上記のステートメントは0
、JSXが適切にレンダリングするを返します。それはあなたが持っていなかったCount: {messageCount && <div>Get your count to zero!</div>}
(または何か不自然なものではない)とは言えません。
修正の1つは、次のように強制0
されるbangbang !!0
ですfalse
。
{!!messageCount && <div>You have messages!</div>}
JSXのドキュメントでは、より明示的に、自己コメントコードを記述し、比較を使用してブール値に強制することを推奨しています。
{messageCount > 0 && <div>You have messages!</div>}
私は三者で偽りを処理する方が快適です-
{messageCount ? <div>You have messages!</div> : false}
Typescriptでも同じことが言えます:ブール値を返す関数がある場合(またはブール値に値を割り当てている場合)、[通常は]ブール値のyを返したり割り当てたりすることはできません。強く型付けされたブールでなければなりません。つまり、iff myObject
は強く型付けされ、return !myObject;
ブール値を返す関数では機能しますが、機能return myObject;
しません。return !!myObject
Typescriptの期待に合わせる必要があります。
Typescriptの例外?myObject
だった場合any
、JavaScriptのワイルドウエストに戻り!!
、戻り値の型がブール値であっても、なしで返すことができます。
これらはJSXとTypescriptの規則であり、JavaScriptに固有の規則ではないことに注意してください。
しかし0
、レンダリングされたJSXに奇妙なs が見られる場合は、緩やかな偽の管理を考えてください。