Boolean evaluation of JavaScript arrays
I ran across an interesting bug the other day. I was testing an array to see if it evaluated to Boolean false, however just directly evaluating it always returned true:
> !![]
true
Okay, so basically any array I put in there will be true
regardless, right? I run this in the JavaScript console just for fun:
> [] == true
false
What is going on here?
It has to do with the The Abstract Equality Comparison Algorithm versus the algorithm used to tranform a value to a boolean.
By looking at the spec, we can see that the point number 9. is the only one that defines what should be happening when Type(left side value) is Object . However it's specifying that the right side value has to be either String or Number .
9 . If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x) == y.
Looking at [] == true
:
typeof []
is 'object'
so we are fine, but typeof true
is not 'string'
or 'number'
, it is 'boolean'
, so it fallback to the last statement, point number 10.
10 . Return false.
However !![]
translates into !!Boolean([])
, and since []
is a thruty value (objects are), it's the same as writing !!true
, which returns true
.
上一篇: Javascript中的成语工作?
下一篇: JavaScript数组的布尔评估