Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #161 (permalink)  
Старый 11.07.2015, 14:48
Новичок на форуме
Посмотреть профиль Найти все сообщения от Льюк
 
Регистрация: 29.08.2011
Сообщений: 6

Эта тема надеюсь многим помогла.
Ответить с цитированием
  #162 (permalink)  
Старый 28.04.2016, 10:12
Аватар для vitoff
Новичок на форуме
Отправить личное сообщение для vitoff Посмотреть профиль Найти все сообщения от vitoff
 
Регистрация: 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 не происходит, то есть работает как полагается. Следовательно, на правую часть каким-то образом влияет многомерный массив слева...
Мне нужно переопределить элемент многомерного массива значением из обычного массива. Основной вопрос: как, сохранив основную идею скрипта, избежать переопределения массива справа?
Буду признателен за помощь.
Ответить с цитированием
  #163 (permalink)  
Старый 29.04.2016, 08:29
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

vitoff, а откуда у массива свойство -1? Оно и выдаёт undefined.
Ответить с цитированием
  #164 (permalink)  
Старый 29.04.2016, 12:23
Аватар для Makarov
Профессор
Отправить личное сообщение для Makarov Посмотреть профиль Найти все сообщения от Makarov
 
Регистрация: 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.
Ответить с цитированием
  #165 (permalink)  
Старый 29.04.2016, 16:07
Аватар для vitoff
Новичок на форуме
Отправить личное сообщение для vitoff Посмотреть профиль Найти все сообщения от vitoff
 
Регистрация: 28.04.2016
Сообщений: 3

Сообщение от Ruslan_xDD Посмотреть сообщение
vitoff, а откуда у массива свойство -1? Оно и выдаёт undefined.
Этот код выставил для наглядности. Исходник же более сложный и врядли я смог бы сформулировать вопрос, выставив его.

Сообщение от Makarov Посмотреть сообщение
Более-менее ясно? Это кажется одна из вещей часто путающих новичков в программировании
В целом, разобрался, спасибо.

Просто раньше с таким не сталкивался, но припоминаю какую-то таблицу связей "переменная-значение". И если я правильно понимаю, то в моём случае mirror[0] не содержал своего значения, а была установлена связь с чужим значением, то есть с comb. Верно?
И если верно, то может дадите идею, как это можно обойти, то есть как mirror[0] передать значение, а не связь?

Сообщение от Makarov Посмотреть сообщение
Массив в javascript (да и почти везде) передается по ссылке, не по значению.
И ещё вопрос (возможно он ответит на мой предыдущий): раз массив передаётся по ссылке, то друге элементы можно передавать по значению?
Ответить с цитированием
  #166 (permalink)  
Старый 29.04.2016, 17:16
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от vitoff
как mirror[0] передать значение
mirror[0] = comb.slice();
Ответить с цитированием
  #167 (permalink)  
Старый 29.04.2016, 18:16
Аватар для Makarov
Профессор
Отправить личное сообщение для Makarov Посмотреть профиль Найти все сообщения от Makarov
 
Регистрация: 08.07.2013
Сообщений: 212

vitoff,
Цитата:
Просто раньше с таким не сталкивался
Еще столкнетесь, это штука которая встречается при написании чего угодно сложнее хеллоуворлда. В современных яп любой сложный тип передается по ссылке. То есть объекты, классы, etc.

Цитата:
Просто раньше с таким не сталкивался, но припоминаю какую-то таблицу связей "переменная-значение". И если я правильно понимаю, то в моём случае mirror[0] не содержал своего значения, а была установлена связь с чужим значением, то есть с comb. Верно?
Ну в самых-самых общих чертах да. Я долго думал как объяснить подробнее, пока не заметил что автор этого сайта давно уже все сделал

Цитата:
раз массив передаётся по ссылке, то друге элементы можно передавать по значению?
Некоторые, числа например, да.
Подробнее смотри по ссылке выше. При непонимании можно попробовать прочитать весь раздел сначала

Как обойти сказал Рони. Этой строчкой он создает копию массива и присваивает вашей переменной ее. (Однако нужно понимать что если элементами копируемого массива являются ссылки, то их эта штука тоже скопирует).
Ответить с цитированием
  #168 (permalink)  
Старый 29.04.2016, 18:25
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 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);
Ответить с цитированием
  #169 (permalink)  
Старый 29.04.2016, 19:57
Аватар для Makarov
Профессор
Отправить личное сообщение для Makarov Посмотреть профиль Найти все сообщения от Makarov
 
Регистрация: 08.07.2013
Сообщений: 212

Понимать что будет в результате достаточно, грузиться разными способами клонирования объекта и их отличием не надо (пока) =)
Ответить с цитированием
  #170 (permalink)  
Старый 01.05.2016, 14:12
Аватар для vitoff
Новичок на форуме
Отправить личное сообщение для vitoff Посмотреть профиль Найти все сообщения от vitoff
 
Регистрация: 28.04.2016
Сообщений: 3

В общем, свою проблему я решил. Всех, благодарю за помощь.

А эту статью тоже теперь рекомендую новичкам, что бы не попадали в такие ситуации:
Сообщение от Makarov Посмотреть сообщение
Я долго думал как объяснить подробнее, пока не заметил что автор этого сайта давно уже все сделал
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часто задаваемые вопросы Gozar Сайт Javascript.ru 2 23.05.2010 02:27