| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Копирование массива |
| Автор: ®™ 30.11.2005, 10:00 | ||||||
oldArr - заполнен числами, например. newArr - пустой. есть ли разница в копировании? так:
или так:
|
| Автор: ®™ 30.11.2005, 10:11 | ||
Есть:
|
| Автор: Sardar 1.12.2005, 15:36 |
| Конечно есть, массивы это обьекты, а обьекты в JS всегда передаються по сылке. Другими словами newArr=oldAr создаёт вторую ссылку указывающую на один и тот же массив. Юзаем метод а что бы снять копию с части или всего массива. |
| Автор: GIK 2.12.2005, 18:42 | ||||
Дак это что значит oldArr ссылается на newArr получается???? А иначе как он получает значения массива newArr???? Я до последнего не верил в этот, даже переменные разные сделал и разместил в разных функциях но все также???. По подробнее можно откоментировать плз.
|
| Автор: Sardar 2.12.2005, 21:57 | ||
Не правильное мышление, и oldArr и newArr это ссылки на один массив (значение). Написав newArr=new Array(); мы запишем в newArr ссылку на новый массив, старый при этом никуда не исчезнет до тех пор, пока на него есть ссылки, т.е. счётчик ссылок больше нуля. Изменяя массив по одной ссылке ты получишь те же изменения и в другой, так как обе указывают на одно и то же значение. Дважды повторил, если ещё не ясно, то почитай ман по PHP (ссылки), Java и другим языкам, всё почти также Кстати из опыта заметил, что все примитивы должны передаваться по значению, а все обьекты, включая массивы и строки должны по ссылке, это эффективно и удобно. |
| Автор: GIK 3.12.2005, 10:50 |
| Так, я запутался. Объесняю свою логику. Если я правильно понял, то изменения касаются массива new Array() (т.е. изменение происходят в нем), на который в свою очередь ссылаются две переменные массива, которые не содержат значений а содержат ссылку. ВЫВОД: newArr ссылаясь на массив new Array() , изменяет значения в НЕМ, а поскольку oldArr ссылается на него же, он получает все изменения. Я правильно, на это раз понял? Если что извиняюсь за назойливость, все таки хочется докопатся до истины не влезая в книгу |
| Автор: Sardar 3.12.2005, 14:19 | ||
| Нет! Представь себе два хранилища в памяти/мешка/таблицы как угодно, главное что их два и они в разных местах. Одно у нас под универсальные ссылки, другое под значения. Все примитивы сохраняються в ссылке, примитивы это целые и вещественные числа. Все обьекты создаються в другом хранилище для значений, в хранилище ссылок создаёться ссылка на обькт, ссылка указыает на обьект в хранилище значений. Обьекты это обьекты, массивы, строки. Все значения имеют некий счётчик ссылок. Каждый раз как у обьекта появляеться новая ссылка, он инкрементируеться и наоборот. Когда счётчик станет 0 (нет более ссылок) он может быть сразу удалён, или помечен на удаление после (в продвинутых сборщиках мусора), одно важно - значение утеряно и получить его больше не возможно. Видим что при таком раскладе у нас не может быть ссылки на другую переменную, но у нас могут быть несколько ссылок на одно и то же значение. Разберём такой код:
Помним что реализация интерпретаторов может сильно различаться, например var oldArr на самом деле не выделяет память под новую ссылку сразу, а зачастую все переменные в функции внутри блока создаються разом. Да и сама реализация ссылок и обьектных значений различаеться - НО! поведение "снаружи" такое же как описано выше. Тобой названный подход я использую в своём Trilobite Scripting Language, скриптовая настройка над вебсервером в embedded окружении, eZ80 проц, 512кб памяти, поэтому нет ни мощей ни места на сборщик мусора и другие фичи |
| Автор: GIK 3.12.2005, 15:54 | ||
| Так. Теперь в голове три реализации (смутно правда) вышеизложенной темы, осталось все сопоставить. Но по ссыдкам и про счетчик все ясно, большое спасибо тебе Остадоль разобратся в изменении значений.
значит получается что если мы присвоили бы не текстовое значение, а новое значение например oldArr=['n1','n2','n3'] то поменяли бы значения в массиве, по ссылке которая хранится в oldArr?, или же создался бы новый массив а счетчик старого контенера уменьшился бы на 1 (т.е. в данном случае исчез бы)? Протестить это помоему нельзя, по крайней мере я не знаю как это сделать. |
| Автор: Sardar 3.12.2005, 20:03 | ||
Теоретически так:
Практически если массивы реализован хештаблицей с ковшами из связанных списков, то интерпретатору проще отбросить ковшы с инфой, чем создавать всю хештаблицу по новой. То есть это зависит от реализации, но! поведение (а это главное Понятия счётчики, способы хранений ссылок, значений и т.д это всё детали реализации, прикладному программисту важно как это внешне работает, т.е. что значения отдельны от ссылок, значения сами по себе убиваються когда ссылок более нет и т.д. |
| Автор: Alex_B 14.6.2007, 22:26 | ||
|