为什么js对象在被分配之前在console.log中不是空的?

问题描述 投票:0回答:1

我遇到一个关于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 = {}; 的值之前。

javascript javascript-objects
1个回答
0
投票

你的代码记录了两个空对象,下面有标签1和2。

在标签3下,你根据列表对象,为标签2的对象分配属性,并记录下来。

接下来,当你展开标签2中的对象时,浏览器会重新解释被记录的内容(它不会保留副本),并查看 现状 的对象,您在标签3下修改了它。 这就是你所看到的。

© www.soinside.com 2019 - 2024. All rights reserved.