6

私はこのトピックについて同僚と約 1 週間議論してきました。私はできる限り 3 進数などを使用して、簡略化されたコードのファンです。最近、彼は私の二重感嘆符の使用について私をからかっています. 多数のテストを実行した後、私は彼に同意し始めています...私のコードで二重の感嘆符を使用するのは賢明ではないかもしれません。このことを考慮:

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

上記の例は期待どおりに機能します。ただし、undefined を返す可能性のある変数をチェックすると、特に IE7 でエラーが発生します。ただし、これをコンソールで実行すると、期待どおりの結果が得られます。

if(randomvar) alert('Works');

このアプローチを使用すると、変数が未定義の場合、黙って失敗します。これは、二重の感嘆符の使用全体に疑問を投げかけます。実際にこのオペレーターが有利になる状況はありますか?

4

4 に答える 4

9

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

これはどっちでもいい

  1. 価値の真偽を捉える
  2. コレクションのために元のオブジェクトを解放する (それが最終的な参照になるはずです)
  3. 強制等価 ( ) を使用して、後でオブジェクトを誤って使用するのを防ぐのに役立ちます==。それらすべてを防ぐわけではありませんが、強制的にブール値にすると、一連のシナリオが削除されます。
于 2011-09-19T20:16:27.823 に答える
6

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

于 2011-09-19T20:16:10.600 に答える
1

IE でテストしました - !!undefinedfalse を返します。これは正しい行動だと思います。

どこ!!が役に立つか(または役立つ可能性があるか)について。

次に例を示します。

パラメータを受け入れる関数があるとします。

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

で呼び出す:test(1)警告ウィンドウはポップアップしませんが、1 は atrueまたはtrue-ish 値であることが一般的に受け入れられています。はい、チーム内の合意と、現在のデータ型を渡すことは開発者のそれぞれの責任であると主張する人もいるかもしれませんが、JavaScript の正しいデータ型は何ですか? 特に、どれがどれであるかを検証するコンパイラがない場合。

したがって、上記の状況では、if (!!param)代わりに使用しますif (param === true)

于 2014-03-13T22:19:24.967 に答える
0

それで、私はそれtypeof !!x === "boolean"とその背後にあるロジック(!x逆ブール値としてキャストする、!!x逆に戻すなど)を理解していますが、本質的に問題があるのでしょうか?未定義の変数をキャストすると、スクリプト エラーが発生します。私はそれを期待しますが、!!x == falseそうtypeof !!x === "undefined"ではありません。これはより安全な選択になるようです:

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

!!x誰かが使用がより適切なシナリオを提供できますか? 現時点では、それを使用する利点は見られません。

頭を掻いて…

于 2011-09-20T15:40:50.310 に答える