Javascript 将对象属性设置为“未定义”

Javascript 将对象属性设置为“未定义”,javascript,Javascript,在Chrome和Node的控制台上,我将对象的属性赋值为undefined const foo = { bar: undefined }; 当我再次计算foo时,我希望它会给我一个空对象({}),但它会返回: { bar: undefined } {bar:undefined}和{}之间有什么区别吗 我之所以问这个问题,是因为这个差异使我的测试失败了——我希望结果是{},但它失败了,因为实际的响应是{bar:undefined} 如果是{bar:null}我会理解,因为null是一个

在Chrome和Node的控制台上,我将对象的属性赋值为
undefined

const foo = {
  bar: undefined
};
当我再次计算
foo
时,我希望它会给我一个空对象(
{}
),但它会返回:

{
  bar: undefined
}
{bar:undefined}
{}
之间有什么区别吗

我之所以问这个问题,是因为这个差异使我的测试失败了——我希望结果是
{}
,但它失败了,因为实际的响应是
{bar:undefined}


如果是
{bar:null}
我会理解,因为
null
是一个实际值。但我的理解是,
未定义
意味着属性未定义,因此甚至不是一个值。

实际上是的。对于第一个定义了名为
bar
,但其值为
未定义的属性,属性存在。对于第二个,您没有名为
bar
的属性

你可以看看这个例子。在对象上调用
hasOwnProperty
,将返回
bar
属性的结果。
foo1
的属性
bar
存在,它不依赖于属性值

const foo1={
酒吧:未定义
};
常量foo2={};
console.log(foo1.hasOwnProperty('bar'));

console.log(foo2.hasOwnProperty('bar'))
使用
delete
操作符完全删除属性(这样
hasOwnProperty()
for in
get*propertydescriptor()
等就看不到它了)。

当然这两者之间有区别
{}
是一个空的对象,而
{bar:undefined}
是一个属性
bar
未定义的对象

注:我看到你对另一个答案的评论。是,
bar
属性未定义,但它仍然存在。变量或属性未定义或不存在之间存在差异。举个例子:

varx;

控制台日志(x)是的,有区别
{bar:undefined}
有一个名为
bar
的属性,其值为
undefined
,而
{}
没有名为bar的属性

{bar:undefined}==true中的“bar”


null
undefined
是两个不同的东西,但它们都是值。我认为您的困惑源于这样一个事实,即访问一个不存在的属性也会导致
未定义。例如,
({}).bar==未定义的

const foo = {
  bar: undefined
};

但是,如果对象的属性确实存在,但值
未定义
,并且这些对象之间存在差异,则该属性也是有效的。如其他人所述,您可以使用
delete
操作符
从对象中删除属性。

未定义是一种数据类型,如果您花费未定义或为空,则属性栏将始终等于花费的值,而不是空值

如果您需要的是空对象,则可以执行以下操作:

const foo = {
  bar: new Object(null); // or empty, or false
};

or 

const foo = {
  bar: {}
};
通过以下方式在控制台中进行检查:

({} === undefined); // this return false
(new Object() === undefined); // this return false

未定义是一个值。您可以使用
delete
运算符。{bar:undefined}和{}之间有什么区别吗?“是的,一个是空对象,另一个是具有1个属性且值为undefined的对象。如果它是
{bar:null}
,我会理解,但我认为
undefined
表示属性未定义,因此甚至不是值。@dayuoli
null
undefined
是两个不同的东西,但它们都是值。我认为您的困惑源于这样一个事实,即访问一个不存在的属性的结果也是
未定义的
,例如
({}).bar==未定义的
。但是,如果对象的属性确实存在,但其值未定义,并且这些对象之间存在差异,则该属性也是有效的。如其他人所述,您可以使用运算符从对象中删除属性。@dayulli如果要从对象中删除属性,而不是将其值设置为
未定义的
,则可以使用delete运算符。“我认为您的困惑源于这样一个事实,即访问一个不存在的属性也会导致
未定义