在JavaScript

时间:2017-11-01 23:02:57

标签: javascript undefined

如果我打开我的JavaScript控制台(Chrome上的F12)并定义变量var x = {};,然后在控制台中输入x,它会向我显示一个空对象:{}。到目前为止一切都很好。

如果尝试查看x.a,则控制台会向我undefined,如果我明确测试x.a === undefined,则会true。到目前为止一切都很好。

一切都在告诉我x.a的价值是undefined

所以,由于它的值是未定义的,我现在执行一个我期望绝对没有的命令: x.a = undefined;。我认为这不应该改变任何事情。

但现在,如果我将x放在控制台中,它会显示{a: undefined}而不是{}。这证明事情发生了变化......

1。这里发生了什么?

2。是否有任何可能产生影响的情况?

第3。如果是,我该如何让该对象回到其初始状态?

注意:当然,对于问题3,重新分配到新的{}显然不是一种选择,因为它不再===到之前的值。

3 个答案:

答案 0 :(得分:1)

JavaScript将属性设置视为任何值是有意义的事情。 in运算符说明了:

var x = {};
console.log("a" in x); // false
x.a = undefined;
console.log("a" in x); // true

in运算符是测试对象中是否存在特定键的可靠方法,无论其值如何。如果属性直接出现在对象上,还有Object.hasOwnProperty()函数。

如果您想完全摆脱某个属性,可以使用delete

delete x.a;
console.log("a" in x); // false

undefined“值”(它真的是一个值?)本质上是JavaScript设计的瑕疵;它使得语言实际上有两个null值。我明白为什么会这样,但这并不会使情况变得更容易处理。

答案 1 :(得分:1)

  

1。这里发生了什么?

首先,您正在访问不存在的属性。这将始终返回语言规范中定义的undefined

但是一个属性也可以存在并具有值undefined,这就是你在做什么时获得的

x.a = undefined;

这会在a上创建属性x,并为其指定值undefined

  

2。有什么情况可以产生影响吗?

测试属性的存在将导致第一种情况为false,第二种情况为true



var x = {};
console.log('a exists', 'a' in x);

x.a = undefined;
console.log('a exists', 'a' in x);




在测试存在时,属性的值是无关紧要的。

同样,获取对象的所有属性会产生不同的结果:



var x = {};
console.log(Object.keys(x));

x.a = undefined;
console.log(Object.keys(x));




  

3。如果是,我该如何让该对象回到其初始状态?

您可以使用delete运算符删除属性:

delete x.a;

答案 2 :(得分:0)

你可以像这样删除密钥:

delete x.a;