如果我打开我的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,重新分配到新的{}
显然不是一种选择,因为它不再===
到之前的值。
答案 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;