Typing in Chrome console:
{}[true] // [true] (object)
!!{}[true] // false (boolean)
Why is !!{}[true] not true when {}[true] is?
Typing in Chrome console:
{}[true] // [true] (object)
!!{}[true] // false (boolean)
Why is !!{}[true] not true when {}[true] is?
How did you evaluate {}[true]
? Actually it's undefined
since empty object doesn't have property named 'true'
. And it's obvious that undefined
is not true
.
UPD: I've checked it in Google Chrome Developer Tools and...
{}[true] // [true]
!!{}[true] // false
console.log({}[true]) // undefined
The first line is [true]
since there are 2 statements involved. The first one is an empty block ({}
) and the second one is an array with one element (true). In contrast second line evaluates as expression (as well as the argument in the third one), to {}
which here is no longer a block but an empty object.
Assuming these statements stand on their own:
{}[true]
is interpreted as
{} // empty block
[true] // array literal expression
So if you type this in the console, the result of the last statement is printed, which is an array containing one element, the boolean value true
.
!!{}[true]
on the other hand is interpreted as accessing the property 'true'
of an empty object. This will return undefined
and is converted to false
when cast to a boolean.
This depends on the context. When JavaScript parser sees {}
at the begining it thinks its a block of code, not object, thus effectively {}[true]
is the same as [true]
and indeed, in console:
> {}[true]
[true]
but
> x = {}[true];
undefined
because {}
is not at the begining or
> ({}[true])
undefined
because ()
forces JS to treat it like an expression.
If JavaScript parser sees something in front of {}
it interprets {}
as object, thus in console:
> !!{}[true]
true
{}[true] => true (object)
Not really a boolean object. If at all, it returns an array with one item - the boolean true. This happens when {}
is interpreted as an (empty) block (see Why {} != ( {} ) in JavaScript?), and the second statement [true]
is an array literal. If you tried
({}[true])
// or
({})[true]
(or force it in some other way to be evaluated as an expression) you access the "true"
property of an empty object which is undefined
. This happens in your second case as well:
!!{}[true] => false (boolean)
as the !!
coerces the {}
to be interpreted as an object literal. And !undefined
is true
, so !!undefined
will yield false
.