Javascript: Является ли пустой объект фальшивым?

Пустой объект не определен, как этот var empty_obj = {}.

Неопределенное будет ложным. Но я замечаю, что empty_obj || 3 empty_obj || 3 вернет empty_obj не 3.

Это почему?

Ответ 1

Пустой объект не undefined.

console.log({} === undefined); // false
console.log(typeof {}); // object

Это истинное значение:

if ({}) console.log('truthy'); // truthy

Он даже имеет некоторые свойства:

console.log(typeof {}.hasOwnProperty); // function

Единственными значениями фальши в JS являются 0, false, null, undefined, пустая строка и NaN.


Вы можете быть смущены возвращаемым значением операторов var =. Они всегда будут отображаться как undefined в консоли Chrome:

> var obj = {}
undefined
> var x = 100
undefined
> var y = "potato"
undefined

Просто потому, что оператор var = возвращает undefined, не означает, что значение было undefined. Хотя без var присваивания возвращают присваиваемое значение:

> obj = {}
{}
> x = 100
100
> y = "potato"
"potato"

Ответ 2

Пустым объектом не является undefined, только объекты типа undefined 1 равны undefined:

[[email protected]~]node
> undefined == {}
false
> typeof {}
'object'
> typeof undefined
'undefined'

1 Можно переопределить undefined, если не использовать строгий режим. Проверка с помощью typeof или против void 0 безопаснее.

Ответ 3

Вы определили empty_obj как объект, который, как оказалось, не имеет никаких определенных свойств, но он определен. По этой причине empty_obj приводит к истинному значению и возвращает в присваивании.

var myobj = {}; //defined
var myobj2;     //undefined

if(myobj == undefined)
{
    console.log("myobj is undefined");
}
if(myobj2 == undefined)
{
    console.log("the 2nd one is undefined");
}
if(myobj)
{
    console.log("myobj isn't falsy");
}
if(myobj2)
{
     console.log("myobj2 isn't false");
}