私がこれをテストしたとき、nodejsとchromeのコンソールで遊んでいました:
[] == true // false
![] == true // false
!![] == true // true
どうして?間違っていませんか?
私がこれをテストしたとき、nodejsとchromeのコンソールで遊んでいました:
[] == true // false
![] == true // false
!![] == true // true
どうして?間違っていませんか?
ECMAScript標準を参照してください:
11.4.9論理否定演算子(!)
プロダクションUnaryExpression :! _ UnaryExpressionは次のように評価されます。
- ExprをUnaryExpressionの評価結果とします。
- oldValueをToBoolean (GetValue(expr))とします。
- oldValueがtrueの場合、falseを返します。
- trueを返します。
9.2 ToBoolean
抽象演算ToBooleanは、その引数を表11に従ってブール型の値に変換します。
- 未定義→false
- null→false
- ブール値→結果は入力引数と同じです(変換なし)。
- 数値→引数が+0、-0、またはNaNの場合、結果はfalseです。それ以外の場合、結果は真です。
- 引数が空の文字列(長さがゼロ)の場合、結果はfalseになります。それ以外の場合、結果は真です。
- オブジェクト→true
配列はオブジェクトです。
これは、ブラウザが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
[] == 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
あなたがそれについて考えるのを助けるかもしれないもう一つのこと![] == false
はtrue
.
!![] == true
!!
条件ステートメントで true または false になるかどうかに基づいて、何かを true または false の値に変換するため、true です。したがってif(obj)
、if(!!obj)
常に同じ結果になります。