Javascript: 空对象是假对象吗?

空对象是未定义的,就像这个 var empty_obj = {}

一个未定义的将是一个错误的。但我注意到 empty_obj || 3将返回 empty_obj而不是 3

为什么?

78329 次浏览

空对象是未定义的 没有

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 =语句返回未定义的值并不意味着该值未定义。不过,如果没有 var,赋值确实会返回被赋值的值:

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

空对象不是未定义的,只有 undefined1类型的对象是未定义的:

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

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

您已经将 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");
}

如上所述,在 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({}));

附言

此代码片段只适用于对象,不适用于未定义或 null 的对象