Замыкания, область видимости

function createKeeper() {
	var keeper = {}, links = [];
	return {
		put: function(key, value){
			keeper[key] = value;
			console.log('keeper', keeper, key, value)
			if(typeof key === "object"){
				links.push(key);
			}
		},

		get: function(key){
			if(typeof key === "object"){
				for(var i = 0; i < links.length; i++){
					if(links[i] == key){
						return keeper[key];
					}
				}
			}
			else 
				return keeper[key];
		}
	};
}

var keeper = createKeeper();
var key1 = {};
var key2 = {};
keeper.put(key2, 999)
keeper.put(key1, 'lol')
console.log(keeper.get(key2))

Каждый раз когда делается put, логируем содержимое внутреннего объекта keeper.

После первого put он {'[object Object]': 999}, после второго {'[object Object]': "lol"}.
Видишь, что с тем-же самым ключом [object Object] хранятся данные, положенные для разных объектов в переменных key1 и key2. Механику описал @xoria:

Из-за вышеописанного получается что для объекта в переменной key2 возвращается не то значение, которое было положено для этого объекта.

получается что в качестве ключа все равно вписалась просто строка а не ссылка? а строки они одинаковые в отличие от ссылок на разные объекты. и значение тупо перезаписывалось . так?

Именно так. Ключами джаваскриптовых объектов могут быть только строки.

Все верно

Я не знаю как иначе мне передать туда ссылку, я уже столько всего перечитал но везде пишут только об [object Object] как строке. Просвети темноту плз. или кажи где об этом можно узнать я сам прочитаю))

Можешь придумать способ связать хранить пару объектов так чтобы имея ссылку на один из них можно было получить второй? Ты можешь использовать сколько угодно вспомогательных объектов и массивов, создавать любые структуры из них.

Ситуация такая, что ты не сможешь отличать разные объекты, если они будут у тебя ключами в главном объекте keeper. По факту любые объекты будут [object Object] и значение последнего будет перезаписывать предыдущее. Поэтому тебе надо придумать другой формат хранить ключи и значения в кипере.

2 лайка
function createKeeper() {
	var keeper = {}, keys = [], count = 0;
	return {
		put: function(key, value){
			var acc = 0;
			for(var i = 0; i < count; i++){
				if(keys[i] == key){
					acc = i;
				}
			}
			if(acc){
				keeper[acc] = value;
			}
			else{
					keeper[count] = value;
					keys[count] = key;
					count++;
			}
		},

		get: function(key){
			for(var i = 0; i < count; i++){
				if(keys[i] == key){
					return keeper[i];
				}
			}
			return null;
		}
	};
}

Я подумал))) наконец)) пришел к вот такому, и мне кажется это верным) но почему-то данный код не хочет перезаписать значение уже существуещего ключа. хелп)

Верное наравление мышления. Дальше два пути:

  1. Ты можешь заставить этот код работать, дописав проверок и условий.
  2. Ты можешь подумать, и упростить код до такой степени, что проблема будет решаться легко.

Аргументы в пользу упрощения. Этот код подозрительно похож на код работы с массивом. Увеличение индекса, добавление элемента в конец. Тут можно обойтись массивом, и думать в терминах массива, а не свойств объекта.

if(acc){
				keeper[acc] = value;
			}
			else{
					keeper[count] = value;
					keys[count] = key;
					count++;
			}

Аргументы в пользу исправления того что есть. Этот код ниже работает с индексами. Так что даже если в результате if(keys[i] == key) в acc будет 0, то условие if(acc){ не выполнится. А ты хотел бы чтобы оно выполнилось. Потому что нужно переписать ключ с нулевым индексом.

for(var i = 0; i < count; i++){
	if(keys[i] == key){
		acc = i;
	}
}
if(acc){
	keeper[acc] = value;
}
else{
		keeper[count] = value;
		keys[count] = key;
		count++;
}
1 лайк

боже как я лоханулся с индексами) ну я думаю пока сделаю как смогу а потом переделаю по другому пути. потому что два дня а результата нету) боже мой я еще и написал if(acc)… даю жару сегодня… утал просто.

ДАААААААААААААА!!!

я отдоху от этой задачи денек другой и вернусь к ней еще. Спасибо ребят за помощь, и извиняюсь что надоел со своими вопросами по кд.

2 лайка