将对象属性设置为undefined

时间:2017-12-21 17:43:08

标签: javascript

在Chrome和Node的控制台上,我指定了一个对象的属性,其值为undefined

const foo = {
  bar: undefined
};

当我再次评估foo时,我希望它能给我一个空对象({}),但它会返回:

{
  bar: undefined
}

{ bar: undefined }{}之间是否存在差异?

我问的原因是这种差异导致我的测试失败 - 我希望结果为{},但它失败了,因为实际响应是{ bar: undefined }

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

5 个答案:

答案 0 :(得分:3)

是的,有区别。 { bar: undefined }有一个名为bar的属性,其值为undefined,而{ }没有名为bar的属性。

'bar' in { bar: undefined } === true

nullundefined是两个不同的东西,但它们都是价值观。我认为您的困惑源于这样一个事实,即访问不存在的属性也会评估为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 inget*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