在Chrome和Node的控制台上,我指定了一个对象的属性,其值为undefined
。
const foo = {
bar: undefined
};
当我再次评估foo
时,我希望它能给我一个空对象({}
),但它会返回:
{
bar: undefined
}
{ bar: undefined }
和{}
之间是否存在差异?
我问的原因是这种差异导致我的测试失败 - 我希望结果为{}
,但它失败了,因为实际响应是{ bar: undefined }
。
如果是{ bar: null }
我明白了,因为null
是实际值。但我的理解是undefined
意味着属性未定义,因此甚至不是值。
答案 0 :(得分:3)
是的,有区别。 { bar: undefined }
有一个名为bar
的属性,其值为undefined
,而{ }
没有名为bar的属性。
'bar' in { bar: undefined } === true
null
和undefined
是两个不同的东西,但它们都是价值观。我认为您的困惑源于这样一个事实,即访问不存在的属性也会评估为undefined
。即({}).bar === undefined
。
但是,如果对象的属性确实存在,但值为undefined
,则这些对象之间也存在差异。正如其他人所述,您可以使用delete
运算符delete
来自对象的属性。
答案 1 :(得分:1)
其实是的。对于第一个,您定义了名为bar
的属性,但它的值为undefined
,属性存在。对于第二个,您没有名称为bar
的属性。
您可以查看此示例。在对象上调用hasOwnProperty
将返回bar
属性的结果。 bar
的属性foo1
存在,并且不依赖于属性值。
const foo1 = {
bar: undefined
};
const foo2 = { };
console.log(foo1.hasOwnProperty('bar'));
console.log(foo2.hasOwnProperty('bar'));

答案 2 :(得分:0)
当然两者之间存在差异。 {}
是一个空的对象,而{ bar: undefined }
是一个未定义属性bar
的对象。
注意:我看到你对其他答案的评论。是的,bar
属性未定义,但仍然存在。变量或属性未定义或不存在之间存在差异。举个例子:
var x;
console.log(x);

结果会得到undefined
,但您能否说变量x
不存在?当然它确实存在。 bar
属性也是如此,它存在并且使对象与空对象{}
不同。
因此,当您将属性分配给undefined
时,您只会删除其值,但该属性会保留。当您使用delete
时,您会移除该属性本身,这就是差异。
答案 3 :(得分:-2)
使用delete
运算符完全删除属性(以便hasOwnProperty()
,for in
,get*PropertyDescritor()
等不会看到它。
答案 4 :(得分:-2)
undefined是一种数据,如果您使用undefined或null,则属性栏将始终等于您所花费的而不是空。
如果你需要的是一个空物体,你可以这样做:
const foo = {
bar: new Object(null); // or empty, or false
};
or
const foo = {
bar: {}
};
检查您的控制台:
({} === undefined); // this return false
(new Object() === undefined); // this return false