Почему объект js не пуст в файле console.log перед его назначением? - PullRequest
0 голосов
/ 01 мая 2020

Я столкнулся с неожиданным поведением в отношении 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: {…} }

... в этот момент должно отображаться текущее состояние объекта. Однако независимо от того, в каком порядке вы развернете узлы объекта в консоли, last testobj = {}; перед forEach l oop будет отображать текущее / обновленное значение объекта. Это почему? Раскомментирование всех трех меток дает:

Object {  } // <--- empty

Object {  } // <--- empty

Object {  } // <--- not empty

After assigned:
Object { 0: {…}, 1: {…}, 2: {…} }

Кроме того, i в Chrome показывает отладчик для каждого объекта:

Значение ниже было оценено только сейчас

Обновление: console.log(JSON.parse(JSON.stringify(testobj))); показывает ожидаемый результат (все объекты пусты до назначения) во всех трех случаях меток. Мне все еще странно, что консоль показывала текущее / (в реальном времени?) Значение объекта только для last testobj = {}; до назначения значений.

1 Ответ

0 голосов
/ 01 мая 2020

Ваш код регистрирует два пустых объекта под меткой 1 и 2.

Под меткой 3 вы назначаете свойства для объекта из метки 2 на основе объекта списка и регистрируете это.

Далее, когда вы раскрываете объект из метки 2, браузер повторно интерпретирует то, что было зарегистрировано (он не сохраняет копию), и смотрит на текущее состояние объекта, который вы изменили под этикеткой 3. Вот на что вы смотрите.

...