Я столкнулся с неожиданным поведением в отношении 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 = {};
до назначения значений.