5

私がこれをテストしたとき、nodejsとchromeのコンソールで遊んでいました:

[] == true // false
![] == true // false
!![] == true // true

どうして?間違っていませんか?

4

3 に答える 3

7

ECMAScript標準を参照してください:

11.4.9論理否定演算子(!)

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

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

9.2 ToBoolean

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

  • 未定義→false
  • null→false
  • ブール値→結果は入力引数と同じです(変換なし)。
  • 数値→引数が+0、-0、またはNaNの場合、結果はfalseです。それ以外の場合、結果は真です。
  • 引数が空の文字列(長さがゼロ)の場合、結果はfalseになります。それ以外の場合、結果は真です。
  • オブジェクト→true

配列はオブジェクトです。

于 2012-06-14T02:34:10.337 に答える
2

これは、ブラウザがJSで暗黙の変換を処理する方法と関係があります。


空の配列であるため、次[]のように評価されfalseます。

[] == true
false == true


ただし、これを実行すると、オブジェクトは値が:notのブール値に変わります。false

![] == true
false == true

ただし、boolean([])が返されtrueます。


ただし、これを行うと、値が:notのブール値に変わります。!false

!![] == true
!false == true
true == true


これが、必要な場合を除いて暗黙の変換が推奨されない理由です。

"1" == true
true == true

"1" === true
false
于 2012-06-14T02:28:30.197 に答える
0

[] == true[]はと等しくないため false であり、 も と等しくないtrueのと同様"some string"ですtrue

![] == trueは、条件文で使用すると true 値に[] 評価されるため、false です。

if([]) console.log('[]');
if(![]) console.log('![]');
// the result will be '[]' because [] will evaluate to true
// in a conditional even though it doesn't equal true

あなたがそれについて考えるのを助けるかもしれないもう一つのこと![] == falsetrue.

!![] == true!!条件ステートメントで true または false になるかどうかに基づいて、何かを true または false の値に変換するため、true です。したがってif(obj)if(!!obj)常に同じ結果になります。

于 2012-06-14T02:37:16.863 に答える