我遇到一个关于JS对象的意外行为。请纠正我我做错了什么。
<?php // BISMILLAHIRRAHMANIRRAHEEM
?>
<!DOCTYPE html>
<head>
<title>test</title>
<script>
var testobj = {};
var ret = '{"status":true,"Action":"GetContacts","data":{"0":{"company":"abc","faxnumber":"111"},"1":{"company":"def","faxnumber":"222"},"2":{"company":"ghi","faxnumber":"333"}},"message":""}';
var retobj = JSON.parse(ret);
function Process() {
var list = retobj["data"];
// Label 1
testobj = {};
console.log(testobj);
// Label 2
testobj = {};
console.log(testobj); // Not empty!!
// Label 3
//testobj = {};
//console.log(testobj);
Object.keys(list).forEach(function(key) {
testobj[key] = {};
testobj[key]["Name"] = list[key]["company"];
testobj[key]["Number"] = list[key]["faxnumber"];
});
// Label 4
console.log("After assigned:");
console.log(testobj);
}
</script>
</head>
<body>
<a href="javascript:Process();">Click</a>
</body>
</html>
我需要将一个对象重置为空。员额 关于 delete
在试验其他选项的同时,我正在寻找一个解释为什么 testobj
是不是记录空到控制台输出? 控制台输出 testobj
如果我把下面的两行代码注释掉,就会发现,这两行代码中的数据都被填满了,而这些数据将在后面的代码中被填满。// Label 2
,控制台输出下 // Label 1
给出一个充满 testobj
. 同样,如果 // Label 1, 2, 3
都是未加注释的,控制台输出给出了前两个 testobj
为空,而第三个则填充了以后要填充的数据。testobj = {};
正在获取分配给即将被分配数据的对象。Process();
至少在对象最初应该是空的时候也是如此。
请告诉我正确的方向。我已经在Firefox v75.0和Chrome v81.0.4044.129上测试过了。
阅读答案 此职位......控制台显示前两个对象为空,直到展开为止,这是有道理的。
Object { } // <--- empty
Object { } // <--- not empty
After assigned:
Object { 0: {…}, 1: {…}, 2: {…} }
...... 这时应该显示对象的当前状态。然而,无论你以何种顺序展开控制台中的对象节点,都会出现以下情况 最后的 testobj = {};
之前 forEach
循环是显示对象的当前更新值。为什么会这样呢,把这三个标签都取消标注,就会得到。
Object { } // <--- empty
Object { } // <--- empty
Object { } // <--- not empty
After assigned:
Object { 0: {…}, 1: {…}, 2: {…} }
还有: i 在Chrome调试器中为每个对象显示。
下面的值刚刚被评估过
更新。console.log(JSON.parse(JSON.stringify(testobj)));
在所有三种标签情况下,都显示了预期的输出(所有对象在被分配前为空)。我还是觉得很奇怪,控制台只显示了当前(实时的?最后的 testobj = {};
的值之前。
你的代码记录了两个空对象,下面有标签1和2。
在标签3下,你根据列表对象,为标签2的对象分配属性,并记录下来。
接下来,当你展开标签2中的对象时,浏览器会重新解释被记录的内容(它不会保留副本),并查看 现状 的对象,您在标签3下修改了它。 这就是你所看到的。