Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Empty array is false, but in IF statement it returns true [duplicate]

This returns true:

[] == false

But here, alert is called:

if([]){ alert('empty array is true here'); }

Can you explain why?

like image 306
karaxuna Avatar asked Mar 06 '13 06:03

karaxuna


People also ask

Is empty array True or false?

Because Array is type of object , the fact that an empty Array is conversed to true is correct.

Is an empty array equal to false?

Empty arrays are true but they're also equal to false.

How do you check if an array is empty?

To check if an array is empty or not, you can use the . length property. The length property sets or returns the number of elements in an array. By knowing the number of elements in the array, you can tell if it is empty or not.

What is value of empty array?

An array value can be non-empty, empty (cardinality zero), or null. The individual elements in the array can be null or not null. An empty array, an array value of null, and an array for which all elements are the null value are different from each other. An uninitialized array is a null array.


1 Answers

According to section 11.9.3 of the ECMAScript® Language Specification, any == comparison is done as follows:

  1. If Type(x) is the same as Type(y), then
    1. If Type(x) is Undefined, return true.
    2. If Type(x) is Null, return true.
    3. If Type(x) is Number, then
      1. If x is NaN, return false.
      2. If y is NaN, return false.
      3. If x is the same Number value as y, return true.
      4. If x is +0 and y is −0, return true.
      5. If x is −0 and y is +0, return true.
      6. Return false.
    4. If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false.
    5. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
    6. Return true if x and y refer to the same object. Otherwise, return false.
  2. If x is null and y is undefined, return true.
  3. If x is undefined and y is null, return true.
  4. If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).
  5. If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x) == y.
  6. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
  7. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
  8. If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
  9. If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x) == y.
  10. Return false.

In the first step, ToNumber() is applied to false and yields Number(0). In the second step, rule #9 applies ToPrimitive() to the empty array and yields "" which, cast to a numeric value, becomes Number(0) as well.

Additionally section 9.2 says this about using an object in an expression:

The abstract operation ToBoolean converts its argument to a value of type Boolean according to this table:

  • 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
like image 73
Ja͢ck Avatar answered Oct 09 '22 01:10

Ja͢ck