1 / 1 / 0
Регистрация: 07.07.2019
Сообщений: 29

JSON.stringify и return(3)

12.09.2022, 14:13. Показов 641. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let room = {
number: 23,
};
 
let meetup = {
title: "Совещание",
occupiedBy: [{name: "Иванов"}, {name: "Петров"}],
place: room,
};
 
room.occupiedBy = meetup;
meetup.self = meetup;
 
let arr = [];
 
console.log( JSON.stringify(meetup, function replacer(key, value) {
 
if (arr.includes(value)) return undefined
 
arr.push(value)
return value;
}));
Программа с циклами. И без изолирующих эти циклы строк.
Типа "return (key != "" && value == meetup) ? undefined : value;"
Введенный пользователем собирающий массив arr для предотвращения
дубля value и работает только на это. Хотя циклы в коде программно
не изолированы, код работает и заканчивается корректно,сериализованный
объект создается. И программа заканчивается без ошибок. Похоже,
return undefined и вывод результата кода происходит после начала
вторичного обращения программы к объекту "meetup". Т.е. результат
вызова "" : [object Object]. Дубль значения и приводит к return undefined.
Но ведь это не обязательно должно приводить к завершению программы.
Почему программа не стала бесконечно гонять по циклу, постоянно выходя
в undefined, а завершилась без ошибки? Или почему она вообще начала работать,
а не выдала ошибку типа "Uncaught TypeError: Converting circular structure to JSON..."?
Чешусь,чешусь во всех местах, а мысль все не приходит.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.09.2022, 14:13
Ответы с готовыми решениями:

JSON.stringify и return(2)
У Ильи Кантора в уроке "Формат JSON ..." в главе "Исключаем и преобразуем: replacer" Есть фраза:"Функция будет вызываться для каждой...

JSON.stringify и return
let users = { id: 1, login: 'harry', password: 'qwerty', status: 'admin', access: true ...

Условие для выбора объекта в body:JSON.stringify()
Доброго времени суток. Необходимо написать условие для выбора объекта в JSON.stringify() . Как это можно сделать? ...

13
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3844 / 1703 / 431
Регистрация: 14.03.2022
Сообщений: 4,350
12.09.2022, 14:25
makle21, может ты роешь подземный ход на чердак?
1
1 / 1 / 0
Регистрация: 07.07.2019
Сообщений: 29
12.09.2022, 14:43  [ТС]
А может и рыл бы, если бы занятие мозгов добавляло. Да и прорыт он у меня уже давно.
0
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
12.09.2022, 15:21
Цитата Сообщение от makle21 Посмотреть сообщение
почему она вообще начала работать, а не выдала ошибку типа "Uncaught TypeError: Converting circular structure to JSON..."?
Потому что, как вы и сказали, вспомогательный массив arr здесь призван устранить дубли значений. Проверка на 18й строке является гарантом того, что дублей быть не может на любом уровне вложенности. А зацикливание объекта - это что? Правильно. Дубль ссылки на объект более высокого/низкого уровня. Соответственно зацикливания у нас произойти никак не может.
1
1 / 1 / 0
Регистрация: 07.07.2019
Сообщений: 29
12.09.2022, 16:52  [ТС]
Цитата Сообщение от Balanaar Посмотреть сообщение
Проверка на 18й строке является гарантом того, что дублей быть не может
Спасибо. Сбивает с толку то, что эта самая ошибка про циклы выскакивает сразу. Как только пытаешься запустить функцию.
Функция еще не начала работать, а ошибка ее уже закрыла. Как бы сначала прошла первичная проверка на работоспособность. Нашлись признаки циклов и ошибка. И до работы с конкретным содержанием (в нашем случае до массива) дело даже не доходит. Наверное, дело в реалии происходит не так, но впечатление такое.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
12.09.2022, 17:49
Цитата Сообщение от makle21 Посмотреть сообщение
дело в реалии происходит не так, но впечатление такое.
Конечно, не так. Сериализатор хранит в памяти посещённые сериализованные объекты и при совпадении кидает ошибку, чтобы не уйти в бесконечный цикл*. В вашем случае до сериализации второй копии дело не доходит.

* - пока не проверяла это в стандарте, могу ошибиться - но это звучит как самое логичное, что можно сделать

Добавлено через 8 минут
Собственно, да:

Цитата Сообщение от ECMA-262
Source: https://262.ecma-international... jsonobject

25.5.2.4 SerializeJSONObject ( state, value )
The abstract operation SerializeJSONObject takes arguments state and value (an Object) and returns either a normal completion containing a String or an abrupt completion. It serializes an object. It performs the following steps when called:
  1. If state.[[Stack]] contains value, throw a TypeError exception because the structure is cyclical.
  2. ...
2
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
12.09.2022, 17:50
Цитата Сообщение от Eva Rosalene Посмотреть сообщение
пока не проверяла это в стандарте
Сомневаюсь, что механизм проверки вообще описан в стандарте. (Ну да. Через проверку value). Там описывается лишь то, что должно быть. А как именно это достигается - дело разработчиков.
Спецификация пункт 25.5.2
NOTE 1: JSON structures are allowed to be nested to any depth, but they must be acyclic. If value is or contains a cyclic structure, then the stringify function must throw a TypeError exception. This is an example of a value that cannot be stringified:
JavaScript
1
2
3
a = [];
a[0] = a;
my_text = JSON.stringify(a); // This must throw a TypeError.
1
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
12.09.2022, 17:52
Цитата Сообщение от Balanaar Посмотреть сообщение
Там описывается лишь то, что должно быть. А как именно это достигается - дело разработчиков.
ECMA-262 описывает алгоритмы достаточно подробно. В теории, конечно, имплементируйте как хотите, но результат должен совпадать 1 в 1 при любых входных данных - дешевле реализовать по слову божьему, а не придумывать велосипед с тем же поведением для мелочей, полагаю.
1
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
12.09.2022, 17:55
Цитата Сообщение от Eva Rosalene Посмотреть сообщение
ECMA-262 описывает алгоритмы достаточно подробно.
Совершенно верно, но дальше уже в силу вступает оптимизация алгоритмов от разработчиков. На деле у разных движков частенько выходят существенные отличия в быстродействии для одного и того же набора операций. Это говорит о разнице реализаций. Конкретный пример сходу привести не смогу.
2
12.09.2022, 18:01

Не по теме:

Цитата Сообщение от Balanaar Посмотреть сообщение
но дальше уже в силу вступает оптимизация алгоритмов от разработчиков
Угу, но я это большей частью к тому, что ошибка в идеале должна быть брошена только при тех же условиях, что и алгоритмом, описанным в стандарте. То есть - что алгоритм идейно повторяет спеку.

0
12.09.2022, 18:02

Не по теме:

Ну это да. С этим я не спорю)
И свой ответ поправил с учётом найденного в спецификации

0
1 / 1 / 0
Регистрация: 07.07.2019
Сообщений: 29
12.09.2022, 19:10  [ТС]
Цитата Сообщение от Balanaar Посмотреть сообщение
И свой ответ поправил с учётом найденного в спецификации
Затаив дыхание следил за спором метров. До изучения спецификаций я пока еще не дорос. Но вывод для себя сделал. Даже код с явным циклом, который (код) будет остановлен из-за этого по ошибке, должен все равно пройти первый проход до начала повтора. И сохранить данные внутри программы, чтобы было с чем сравнить. И если, скажем, прогнать эту программу через консоль разработчика пошагово, этот проход будет виден. Так? Стоит проверить.
0
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5241 / 2115 / 416
Регистрация: 06.01.2013
Сообщений: 4,846
12.09.2022, 19:15
Цитата Сообщение от makle21 Посмотреть сообщение
И если, скажем, прогнать эту программу через консоль разработчика пошагово, этот проход будет виден. Так? Стоит проверить.
Конечно!

JavaScript
1
2
3
4
JSON.stringify({ a: 1, b: [2, 3, { foo: 'bar' }] }, function (key, value) {
    console.log(this, key, value);
    return value;
})
2
1 / 1 / 0
Регистрация: 07.07.2019
Сообщений: 29
12.09.2022, 19:29  [ТС]
Цитата Сообщение от Eva Rosalene Посмотреть сообщение
Конечно!
Ну да. Все правильно. Программа проходит первый раз, результаты сохраняются. Когда доходит до повторения, программа сбрасывается. Додумался бы раньше так сделать, не было бы лишних вопросов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.09.2022, 19:29
Помогаю со студенческими работами здесь

JSON decode и имя return
Как разложить подобный объект на части? { "return": { "success": "true", "number": 92.89, "event":...

Ajax controller return json
<script> $(document).ready(function () { $("#get").click(function () { var formdata = new...

Что это isOk(int s),setAge(int g){if(isOk(g){age=g;return true;}else{.;return false;}}.getName(){return name;}?
package com.company; import java.io.Serializable; public class person implements Serializable { protected String name; ...

Что такое в jquery и java return false и return true
Если я правильно понимаю, то return false отменяет действие по умолчанию, например клик по ссылке, а return true это наоборот приводит в...

В чем разница между return и return false/true
Привет всем. Вот подскажите плиз) return; return false; return true; расскажите пожалуйста об етих операторах.. чем они...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru