2011-09-19 13 views
5

私は約1週間同僚とこのトピックを議論してきました。私は、どこでも可能な限り、三角形などを使用して、簡略コードのファンです。最近、私は二重の感嘆の使用について私を拾ってきた。数多くのテストを実行した後、私は彼に同意し始めています...二重の感嘆符が私のコードで使用することは賢明ではないかもしれません。これを考慮してください:JSの二重の感嘆符 - それを使用する理由がありますか?

var myvar = "Hello"; 
return (!!myvar ? "Var is set" : "Var is not set"); 

上記の例は期待どおりに動作します。しかし、undefinedを返す可能性のある変数をチェックすると、特にIE7でエラーが発生します。

​​

このアプローチを使用して、変数が定義されていない場合、それは静かに失敗し、:私たちは私たちのコンソールでこれを実行している場合我々は、しかし、私たちの期待される結果を取得します。これは私に二重の感嘆符の使用を全く疑わせる。実際にこのオペレータを有益にする状況はありますか?

答えて

5

!!x coerces xをブール値に設定し、プロパティーはx == !!xtypeof !!x === "boolean"です。 (valueOfをオーバーライドすると一般的ではないかもしれませんが、現時点では考えたくありません)

9

JavaScriptの!!の有効な使用があります。これは値をとり、ブール値trueまたはfalseに変換する式です。これは本質的に現在の状態をブール値に強制します。

これは値のtruthiness

  • コレクションのオリジナルのオブジェクト(すなわち、最終的な基準であるべきである)
  • オブジェクトの後、誤った使い方を防ぐのに役立ちます解放のキャプチャの両方

    1. に適してい強制的平等(==)。それらをすべて阻止するのではなく、それを強制的にboolに強制して、一連のシナリオを削除します。
  • +0

    を使用したい グレートの説明、それはまた、あなたがこのように、この演算子を使用するときことは注目に値します: (ウィンドウ。オブジェクト&&(obj1.function1 || obj.2function2))); これは、すべてのものに対して「変換を強制する」全体を拡張します。 convertallthethings.jpeg –

    0

    だから、私はtypeof !!x === "boolean"とその背後にあるロジック(!x!!xはなど、バック反転し、反転ブール値としてキャスト)ことを理解し、それは本質的に問題だ場合、私は思ったんだけど?未定義の変数をキャストすると、手にスクリプトエラーが発生します。私は、の場合はtypeof !!x === "undefined"だと思いますが、そうではありません。

    if((typeof x != "undefined") && (x != null)) { ... } 
    

    誰かが!!xを使用することがより適切であるシナリオを提供することができます。より安全な選択であろうと思われますか?現時点では、私はそれを使用する利点を見ていない。私の頭を悩ま

    ...私はIEでテスト

    1

    - !!undefinedはfalseを返します。私は正しい行動を信じています。

    については、!!が有用です(または役に立つかもしれません)。ここで

    は例です:

    は、パラメータを受け入れる機能を持っていると仮定します。

    で呼び出す

    function test(param) { if (param === true) { alert('OK'); } }

    test(1)は警告ウィンドウがポップアップしません - 一般的に1であることが認められているものの、 trueまたはtrue -ishの値です。はい、誰かが、チームの合意と、currectデータ型を渡す開発者の責任のそれぞれが、JavaScriptの正しいデータ型は何ですか?特にどちらがどちらであるかを検証するコンパイラがない場合。

    は、このように上記の状況では、私が(ワード「truthiness」を使用するためのUpvote!)if (!!param)の代わりif (param === true)

    +0

    '!! param'と' param === true'は同じではありません。'!param'はすべての「偽」値、' false'、 'undefined'、' NaN')に対して 'false'を返します)' param === true'は 'param'が' true'を返すだけですboolean型で、 'true'に設定されています。 あなたが言ったように、チームが型がブール型であることに同意するならば、他の型に渡さないでください。私は個人的に、厳密な型を必要とする場合、関数に渡すときに型に関連する何かのパラメータを命名するという慣習を、リマインダーとして使用します。 'function chocolateStarfish(xInt、yBool){// stuff};'などのように –

    関連する問題