-4

別の値のチェックに基づいて、値をtrueまたはfalseに定義する必要がある場合、次のことを行う際の落とし穴はありますか。

!!someValue

クロムのエンジンに対して簡単に実行すると、次のようになります。

boolCheck=function(someValue){
    return !! someValue;
}

console.log(boolCheck());           //false
console.log(boolCheck(undefined));  //false
console.log(boolCheck(null));       //false
console.log(boolCheck(1));          //true
console.log(boolCheck({va:1}));     //true
console.log(boolCheck("someTS"));   //true
console.log(boolCheck(boolCheck));  //true    

どのSEEMSが機能するか...

4

3 に答える 3

6

!演算子は常にまたはを返すためtruefalse評価がx正常に完了すると仮定する!!xと、ブール値はEcmaScript組み込み関数のBoolean(x)whereと同等です。Boolean

http://es5.github.com/#x11.4.9によると

11.4.9論理否定演算子(!

プロダクションUnaryExpression! UnaryExpressionは次のように評価されます。

  1. ExprをUnaryExpressionの評価結果とします。
  2. oldValueをToBoolean(GetValue(expr))とします。
  3. oldValueがtrue、の場合は、を返しfalseます。
  4. 戻りtrueます。

http://es5.github.com/#x9.2は、 ToBooleanの仕組みを説明しています

9.2 ToBoolean

抽象演算ToBooleanは、その引数を表11に従ってブール型の値に変換します。

表11—ToBoolean変換

Argument Type    Result 
Undefined        false
Null             false
Boolean          The result equals the input argument (no conversion).
Number           The result is false if the argument is +0, −0, or NaN; otherwise the result is true.
String           The result is false if the argument is the empty String (its length is zero); otherwise the result is true.
Object           true

上記の表はほとんどの例を説明していますが、理由が明確でない場合があります

 console.log(boolCheck());

ですfalse。仮パラメーターよりも実際の引数が少ない関数を呼び出す場合、追加のパラメーターには値がundefinedあり、上の表に示すように、は!!undefinedですfalse


やる上での落とし穴はありますか:!!someValue

意図はより明確ではありませんがBoolean(someValue)、プラットフォーム間で一貫して機能し、ほとんどの経験豊富なJavascript開発者がそれを認識します。

于 2012-10-19T14:27:35.177 に答える
0

Javascriptは強く型付けされていないため、値を指定しないと、渡される型に応じて異なる結果が生成されます。そうです、多くの落とし穴があります。

于 2012-10-19T14:27:14.227 に答える
0

これは基本的に、0、null、未定義、またはfalseの場合、falseと評価され、それ以外はtrueと評価されることを意味します。

ちなみに、これは自動的にブール値にキャストされる状況で使用される場合、変数自体を評価するのとまったく同じです。「if(someValue){}」は「if(!! someValue){}」と同じになります。これは、ifステートメントが内容をブール値に自動的に評価するためです。同じことをしているだけです(その状況では冗長に)。しかし、明白な事実は、任意の種類のブール値を使用している場合、99.9999%の確率で、最終的にはそのような方法で評価されるためです。冗長であることを除いて、実際にはコード内の場所はほとんどありません。

しかし、結局のところ、ここで理解するには曖昧すぎるのはあなたの「落とし穴」の定義です。「null」が「false」と評価されて、意図した使用法が破られるかどうかはわかりません。

于 2012-10-19T15:01:03.453 に答える