Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ЧаВО - часто задаваемые вопросы (faq) (https://javascript.ru/forum/misc/9459-chavo-chasto-zadavaemye-voprosy-faq.html)

Льюк 11.07.2015 14:48

Эта тема надеюсь многим помогла.

vitoff 28.04.2016 10:12

Всем привет!
Нужна помощь, казалось бы, в элементарной штуке. Упёрся в вот в это:
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 не происходит, то есть работает как полагается. Следовательно, на правую часть каким-то образом влияет многомерный массив слева...
Мне нужно переопределить элемент многомерного массива значением из обычного массива. Основной вопрос: как, сохранив основную идею скрипта, избежать переопределения массива справа?
Буду признателен за помощь.

ruslan_mart 29.04.2016 08:29

vitoff, а откуда у массива свойство -1? Оно и выдаёт undefined.

Makarov 29.04.2016 12:23

vitoff, Массив в javascript (да и почти везде) передается по ссылке, не по значению.
То есть технически в результате такой конструкции
var comb = [1,0,0];
mirror[0] = comb;

mirror - это не просто какой-то отдельный массив [[1,0,0]]
Это [ссылка на массив comb]; То есть массив, первым элементом которого является та самая штука, которую вы присвоили, сама переменная, а не значение этой штуки.

Более-менее ясно? Это кажется одна из вещей часто путающих новичков в программировании

vitoff 29.04.2016 16:07

Цитата:

Сообщение от Ruslan_xDD (Сообщение 415271)
vitoff, а откуда у массива свойство -1? Оно и выдаёт undefined.

Этот код выставил для наглядности. Исходник же более сложный и врядли я смог бы сформулировать вопрос, выставив его.

Цитата:

Сообщение от Makarov (Сообщение 415282)
Более-менее ясно? Это кажется одна из вещей часто путающих новичков в программировании

В целом, разобрался, спасибо.

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

Цитата:

Сообщение от Makarov (Сообщение 415282)
Массив в javascript (да и почти везде) передается по ссылке, не по значению.

И ещё вопрос (возможно он ответит на мой предыдущий): раз массив передаётся по ссылке, то друге элементы можно передавать по значению?

рони 29.04.2016 17:16

Цитата:

Сообщение от vitoff
как mirror[0] передать значение

mirror[0] = comb.slice();

Makarov 29.04.2016 18:16

vitoff,
Цитата:

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

Цитата:

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

Цитата:

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

Как обойти сказал Рони. Этой строчкой он создает копию массива и присваивает вашей переменной ее. (Однако нужно понимать что если элементами копируемого массива являются ссылки, то их эта штука тоже скопирует).

destus 29.04.2016 18:25

Цитата:

Однако нужно понимать что если элементами копируемого массива являются ссылки, то их эта штука тоже скопирует.
Тогда так для полного счастья
var arr = [1,2, [3,4,5]],
	copy_arr = JSON.parse(JSON.stringify(arr));
	
	arr[2][0] = 99999999;
	alert(arr);
	alert(copy_arr);

Makarov 29.04.2016 19:57

Понимать что будет в результате достаточно, грузиться разными способами клонирования объекта и их отличием не надо (пока) =)

vitoff 01.05.2016 14:12

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

А эту статью тоже теперь рекомендую новичкам, что бы не попадали в такие ситуации:
Цитата:

Сообщение от Makarov (Сообщение 415326)
Я долго думал как объяснить подробнее, пока не заметил что автор этого сайта давно уже все сделал



Часовой пояс GMT +3, время: 20:40.