| 
	| 
	
	| 
		
	| 
			
			 
			
				11.07.2015, 14:48
			
			
			
		 |  
	| 
		
			
			| Новичок на форуме     |  | 
					Регистрация: 29.08.2011 
						Сообщений: 6
					 
		
 |  |  
	| Эта тема надеюсь многим помогла. |  |  
	| 
		
	| 
			
			 
			
				28.04.2016, 10:12
			
			
			
		 |  
	| 
		
			|  | Новичок на форуме       |  | 
					Регистрация: 28.04.2016 
						Сообщений: 3
					 
		
 |  |  
	| Всем привет! 
Нужна помощь, казалось бы, в элементарной штуке. Упёрся в вот в это:
 
var m;
var mirror = [];
var comb = [1,0,0];
mirror[0] = comb;
for(var x = 0; x < 1; x++) {
	mirror[0][x] = comb[-1];
	//m = comb[-1];
}
alert(comb[0]); //undefined
В общем, впервые столкнулся с тем, что переопределяется переменная (массив), находящаяся справа. Это дополнительный вопрос: как такое возможно? 
Если внутри цикла выполнить вторую строку, то переопределения элемента массива comb  не происходит, то есть работает как полагается. Следовательно, на правую часть каким-то образом влияет многомерный массив слева... 
Мне нужно переопределить элемент многомерного массива значением из обычного массива. Основной вопрос: как, сохранив основную идею скрипта, избежать переопределения массива справа? 
Буду признателен за помощь. |  |  
	| 
		
	| 
			
			 
			
				29.04.2016, 08:29
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 30.04.2012 
						Сообщений: 3,018
					 
		
 |  |  
	| vitoff, а откуда у массива свойство -1? Оно и выдаёт undefined. |  |  
	| 
		
	| 
			
			 
			
				29.04.2016, 12:23
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 08.07.2013 
						Сообщений: 212
					 
		
 |  |  
	| vitoff, Массив в javascript (да и почти везде) передается по ссылке, не по значению.  
То есть технически в результате такой конструкции
 
var comb = [1,0,0];
mirror[0] = comb;
 
mirror - это не просто какой-то отдельный массив [[1,0,0]] 
Это [ссылка на массив comb]; То есть массив, первым элементом которого является та самая штука, которую вы присвоили, сама переменная, а не значение этой штуки.
 
Более-менее ясно? Это кажется одна из вещей часто путающих новичков в программировании 			 Последний раз редактировалось Makarov, 29.04.2016 в 12:29.
 |  |  
	| 
		
	| 
			
			 
			
				29.04.2016, 16:07
			
			
			
		 |  
	| 
		
			|  | Новичок на форуме       |  | 
					Регистрация: 28.04.2016 
						Сообщений: 3
					 
		
 |  |  
	| 
	
 
	| Сообщение от Ruslan_xDD   |  
	| vitoff, а откуда у массива свойство -1? Оно и выдаёт undefined. |  
	
 Этот код выставил для наглядности. Исходник же более сложный и врядли я смог бы сформулировать вопрос, выставив его.
 
	
 
	| Сообщение от Makarov   |  
	| Более-менее ясно? Это кажется одна из вещей часто путающих новичков в программировании |  
	
 В целом, разобрался, спасибо.
 
Просто раньше с таким не сталкивался, но припоминаю какую-то таблицу связей "переменная-значение". И если я правильно понимаю, то в моём случае mirror[0]  не содержал своего значения, а была установлена связь с чужим значением, то есть с comb . Верно? 
И если верно, то может дадите идею, как это можно обойти, то есть как mirror[0] передать значение, а не связь?
 
	
 
	| Сообщение от Makarov   |  
	| Массив в javascript (да и почти везде) передается по ссылке, не по значению. |  
	
 И ещё вопрос (возможно он ответит на мой предыдущий): раз массив передаётся по ссылке, то друге элементы можно передавать по значению? |  |  
	| 
		
	| 
			
			 
			
				29.04.2016, 17:16
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 27.05.2010 
						Сообщений: 33,150
					 
		
 |  |  
	| 
	
 
	| Сообщение от vitoff |  
	| как mirror[0] передать значение |  
	
 
mirror[0] = comb.slice();
 |  |  
	| 
		
	| 
			
			 
			
				29.04.2016, 18:16
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 08.07.2013 
						Сообщений: 212
					 
		
 |  |  
	| vitoff,
 
	
 
	| Цитата: |  
	| Просто раньше с таким не сталкивался |  
	
 Еще столкнетесь, это штука которая встречается при написании чего угодно сложнее хеллоуворлда. В современных яп любой сложный тип передается по ссылке. То есть объекты, классы, etc.
 
	
 
	| Цитата: |  
	| Просто раньше с таким не сталкивался, но припоминаю какую-то таблицу связей "переменная-значение". И если я правильно понимаю, то в моём случае mirror[0] не содержал своего значения, а была установлена связь с чужим значением, то есть с comb. Верно? |  
	
 Ну в самых-самых общих чертах да. Я долго думал как объяснить подробнее, пока не заметил что автор этого сайта давно уже все сделал 
	
 
	| Цитата: |  
	| раз массив передаётся по ссылке, то друге элементы можно передавать по значению? |  
	
  Некоторые, числа например, да. 
Подробнее смотри по ссылке выше. При непонимании можно попробовать прочитать весь раздел  сначала
 
Как обойти сказал Рони. Этой строчкой он создает копию массива и присваивает вашей переменной ее. (Однако нужно понимать что если элементами копируемого массива являются ссылки, то их эта штука тоже скопирует). 
			
			
	
			
			
			
			
			
				  |  |  
	| 
		
	| 
			
			 
			
				29.04.2016, 18:25
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 18.05.2011 
						Сообщений: 1,207
					 
		
 |  |  
	| 
	
 
	| Цитата: |  
	| Однако нужно понимать что если элементами копируемого массива являются ссылки, то их эта штука тоже скопирует. |  
	
 Тогда так для полного счастья
 
var arr = [1,2, [3,4,5]],
	copy_arr = JSON.parse(JSON.stringify(arr));
	
	arr[2][0] = 99999999;
	alert(arr);
	alert(copy_arr);
 |  |  
	| 
		
	| 
			
			 
			
				29.04.2016, 19:57
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 08.07.2013 
						Сообщений: 212
					 
		
 |  |  
	| Понимать что будет в результате достаточно, грузиться разными способами клонирования объекта и их отличием не надо (пока) =) |  |  
	| 
		
	| 
			
			 
			
				01.05.2016, 14:12
			
			
			
		 |  
	| 
		
			|  | Новичок на форуме       |  | 
					Регистрация: 28.04.2016 
						Сообщений: 3
					 
		
 |  |  
	| В общем, свою проблему я решил. Всех, благодарю за помощь. 
А эту статью тоже теперь рекомендую новичкам, что бы не попадали в такие ситуации:
 
	
 
	| Сообщение от Makarov   |  
	| Я долго думал как объяснить подробнее, пока не заметил что автор этого сайта давно уже все сделал |  
	
 |  |  |  |