Javascript:空对象是假的吗?

时间:2014-02-13 02:18:47

标签: javascript

空对象未定义,如此var empty_obj = {}。 未定义将是一个错误的。但我注意到了 empty_obj || 3将返回empty_obj而不是3。 那是为什么?

4 个答案:

答案 0 :(得分:42)

空对象未定义。

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

这是一个真正的价值:

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

它甚至有一些属性:

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

JS中唯一的假值是0falsenullundefined,空字符串和NaN


您可能会对var =语句的返回值感到困惑。这些内容在Chrome控制台中始终显示为undefined

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

仅仅因为var =语句返回undefined并不意味着该值未定义。虽然,如果没有var,分配会返回分配的值:

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

答案 1 :(得分:1)

正如上面回答中提到的,空对象在 JavaScript 中不是假值,

如何正确检查obj是否为空?

Object.keys(obj).length === 0 && obj.constructor === Object
<块引用>

为什么我们需要额外的构造函数检查?

您可能想知道为什么我们需要构造函数检查。好吧,它是为了覆盖包装器实例。在 JavaScript 中,我们有 9 个内置构造函数。

new String();
new Number();
new Boolean();
new Array();
new RegExp();
new Function();
new Date();

所以我们可以用 new Object() 创建一个空对象。旁注:您永远不应该使用构造函数创建对象。这被认为是不好的做法。

const obj = new Object();

Object.keys(obj).length === 0; // true

所以只使用 Object.keys,当对象为空时它确实返回 true。但是当我们使用这些其他构造函数创建一个新的对象实例时,不起作用

Object.keys(new String()).length === 0 // false

因此需要对对象实例进行构造函数检查

function isEmptyObj(obj) {
    return Object.keys(obj).length === 0 && obj.constructor === Object;
}

console.log(isEmptyObj({}));

附注

此代码段仅适用于不用于 undefined 或 null 的对象

答案 2 :(得分:0)

空对象未定义,只有undefined 1 类型的对象未定义:

[timwolla@~]node
> undefined == {}
false
> typeof {}
'object'
> typeof undefined
'undefined'

1 当不使用严格模式时,可以重新定义undefined。使用typeofvoid 0进行检查更安全。

答案 3 :(得分:0)

您已将empty_obj定义为碰巧没有任何已定义属性但已定义的对象。出于这个原因,empty_obj导致truthy并在赋值中返回。

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");
}