158

重複
の可能性:何ですか!! (そうではない)JavaScriptの演算子?

このコードに遭遇しました

function printStackTrace(options) {
    options = options || {guess: true};
    var ex = options.e || null, guess = !!options.guess;
    var p = new printStackTrace.implementation(), result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

そして、なぜ二重否定なのか疑問に思わずにはいられませんでしたか?そして、同じ効果を達成するための別の方法はありますか?

(コードはhttps://github.com/eriwen/javascript-stacktrace/blob/master/stacktrace.jsからのものです)

4

3 に答える 3

229

ブール値にキャストします。最初の!ものは一度それを否定し、次のように値を変換します:

  • undefinedtrue
  • nulltrue
  • +0true
  • -0true
  • ''true
  • NaNtrue
  • falsetrue
  • 他のすべての表現false

その後、もう一方!は再びそれを否定します。ブール値への簡潔なキャスト。否定として定義されているという理由だけで、 ToBooleanとまったく同じです。ただし、条件演算子の条件としてのみ使用されるため、ここでは不要です。条件演算子は、同じ方法で真偽を決定します。!

于 2012-05-06T01:52:57.310 に答える
58
var x = "somevalue"
var isNotEmpty = !!x.length;

それをバラバラにしましょう:

x.length   // 9
!x.length  // false
!!x.length // true

したがって、「真の」「偽の」値をブール値に変換するために使用されます。


次の値は、条件ステートメントのfalseと同等です。

  • false
  • ヌル
  • 未定義
  • 空の文字列""(\ ''
  • 数字の0
  • 数NaN

他のすべての値はtrueと同等です。

于 2012-05-06T01:51:42.377 に答える
25

二重否定は、「真実」または「偽」の値をブール値、trueまたはに変換しますfalse

ほとんどの人は、テストとして真実性を使用することに精通しています。

if (options.guess) {
    // runs if options.guess is truthy, 
}

しかし、それは必ずしも次のことを意味するわけではありません。

options.guess===true   // could be, could be not

「真の」値を真のブール値に強制する必要がある場合!!は、それを行うための便利な方法です。

!!options.guess===true   // always true if options.guess is truthy
于 2012-05-06T01:54:50.600 に答える