С Новым годом! Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 07.07.2019
Сообщений: 29

JSON.stringify и return(3)

12.09.2022, 14:13. Показов 598. Ответов 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
3818 / 1656 / 428
Регистрация: 14.03.2022
Сообщений: 4,132
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
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru