空对象未定义,如此var empty_obj = {}。 未定义将是一个错误的。但我注意到了 empty_obj || 3将返回empty_obj而不是3。 那是为什么?
答案 0 :(得分:42)
空对象不未定义。
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 =
语句的返回值感到困惑。这些内容在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
。使用typeof
或void 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");
}