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,125
|
|
Сообщение от 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
|
Я долго думал как объяснить подробнее, пока не заметил что автор этого сайта давно уже все сделал
|
|
|
|
|