Can an Object be false?

As of ES8, no, you cannot make an object evaluates to false in JavaScript.

In the specification, all boolean checks (? ! if etc.) depends on ToBoolean,
which is very, very simple:

  • False if undefined, null, false, zero, NaN, or empty string.
  • True for everything else (Object, Proxy, Symbol, etc.)

If the type of the input is object, the result is true. No question asked. No valueOf, no special case.

There is no way to create a falsy object in JavaScript. Only non-objects can be falsy.

Sometimes you may run into object-like "stuff" that return false. Empty string, for example, are used like an object all the time. document.all is another falsy "object".

These are not real objects, however. They cannot have custom properties, cannot be used as prototype, and does not always behave like an object e.g. typeof or strict equal.

This behaviour is most likely here to stay for backward compatibility.


No. An object that doesn't have any properties assigned is not considered "empty".

The fact that a variable holds an instance of an object is enough to cause javascript to treat the variable as having the value of true when an expression requires a boolean value.

Edit

There are clearly some nuances to be cleared up looking at the other answers here.

null is not an object, it is the distinct lack of an object. The question refers to an Object, that is one that has just been created.


No. But null will convert to false.

> typeof(null)
"object"
> null instanceof Object
false
> !!null
false

To see if the object contains any properties, use (shamelessly copied from How do I count a JavaScript object's attributes?):

function isEmpty (obj) {
    for (var k in obj) 
       if (obj.hasOwnProperty(k))
           return false;
    return true;
}

A null "object" (really value) will return false.

var obj = null;

console.log(!!obj);

If you wanted to check if it has no properties, you might try:

var obj = new Object();
var empty = true;
for (var p in obj) {
    if (obj.hasOwnProperty(p)) {
       empty = false;
       break;
    }
}
console.log(empty);

Tags:

Javascript