@Azperin
Дилетант

Передача объекта по ссылке, работа с памятью?

Почитал https://learn.javascript.ru/object-reference, но всеравно остались вопросы, надеюсь поможете разобраться.
На сервере нода с сокетио. Допустим имеем:

var globalVariable = {
		user111: {
			id: 111,
			name: 'Vasya'
		},
		user222: {
			id: 222,
			name: 'Petya'
		}
	};
	//слушаем ивент на ренейм юзера
	.on('rename', obj => {
		//где obj = { id: [user_id], newName: [string] }
		//изменяем глобальный объект, ссылкой на вновь прибывший ?
		globalVariable['user'+obj.id].name = obj.newName;
	});


Вопросов несколько:
1. сможет ли сборщик мусора забрать именно этот obj или же будет ждать пока не придет новый запрос на этого же юзера он будет висеть в памяти ?
2. что будет если занулить этот объект (obj = null) после присвоения к глобальному объекту ? и правильно ли будет так делать ?
3. или я не правильно все понял и он присваивает только строку (obj.newName), а не ссылку на свойство этого объекта ?
4. как правильно присваивать объекты к глобальному объекту, чтобы на него небыло ссылок ? Пример:

//у юзера есть еще свойство customObj, который является объектом
  .on('someEvent', obj => {
//где obj = { propone: 'someValue', proptwo: 'someValue' }
//предположим что каким-то магическим образом знаем ид юзера
  globalVariable.user111.customObj = obj;
});


Если таких юзеров будет относительно много, оно ведь поидее всю память сожрет, как быть ?
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ответы на вопрос 1
Объекты присваиваются по ссылке, простые типы присваиваются по значению.
Если obj.newName - строка, то свойству globalVariable['user'+obj.id].name будет присвоена строка
Второй случай, obj.newName - объект, в этом случае globalVariable['user'+obj.id].name будет присвоена ссылка на сам объект newName, то, что это объект может быть одновременно свойством obj, ни как не мешает уборщику мусора obj убрать.
В данном конкретном случае присвоение obj = null будет просто лишней бесполезной операцией.

как правильно присваивать объекты к глобальному объекту, чтобы на него небыло ссылок ? Пример:

Это слишком общий вопрос, нет на него короткого ответа и
оно ведь поидее всю память сожрет, как
тоже, слишком детское утвержение, применительно конкретно к вашему куску кода.
Кроме того, "Глобальный объект" какое-то стремное понятие, и, использование глобальных переменных в коде, чревато архитектурой из говен и ходуль.
Прочитайте полностью https://www.ozon.ru/context/detail/id/19677670/ а не одну главу на сайте, тогда вопросы станут более конкретными.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы