Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование массива 
:(
    Опции темы
®™
Дата 30.11.2005, 10:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код

oldArr = new Array()
newArr= new Array()

oldArr - заполнен числами, например.
newArr - пустой.

есть ли разница в копировании?

так:
Код

newArr=oldArr

или так:
Код

for (var i=0; i<oldArr.length;i++) newArr[i]=oldArr[i]; 



  Вверх
®™
Дата 30.11.2005, 10:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть:

Код


oldArr = new Array(1,2,3,4,5,6,7,8,9)
newArr= new Array()

                for (var i=0; i<oldArr.length;i++) newArr[i]=oldArr[i]; 

for (var i=0; i<newArr.length;i++) {newArr[i]=newArr[i]+10}
alert(oldArr+" | "+newArr)

/**/

oldArr = new Array(1,2,3,4,5,6,7,8,9)
newArr= new Array()

               newArr=oldArr

for (var i=0; i<newArr.length;i++) {newArr[i]=newArr[i]+10}
alert(oldArr+" | "+newArr)


  Вверх
Sardar
Дата 1.12.2005, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Конечно есть, массивы это обьекты, а обьекты в JS всегда передаються по сылке. Другими словами newArr=oldAr создаёт вторую ссылку указывающую на один и тот же массив. Юзаем метод а что бы снять копию с части или всего массива.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
GIK
Дата 2.12.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 6
Всего: 14



Цитата
Конечно есть, массивы это обьекты, а обьекты в JS всегда передаються по сылке

Дак это что значит oldArr ссылается на newArr получается????
А иначе как он получает значения массива newArr???? smile
Я до последнего не верил в этот, даже переменные разные сделал и разместил в разных функциях но все также???.
По подробнее можно откоментировать плз.
Код

<html>
 <head>
  <script type="text/javascript">
  <!--   
      function g1()
{
var oldArr = new Array(1,2,3,4,5,6,7,8,9)
var newArr= new Array()
  for (var i=0; i<oldArr.length;i++) newArr[i]=oldArr[i]; 
for (var i=0; i<newArr.length;i++) {newArr[i]=newArr[i]+10}
alert(oldArr+" | "+newArr)
}
  function g2()
{
var oldArr1 = new Array(1,2,3,4,5,6,7,8,9)
var newArr1= new Array()

               newArr1=oldArr1 //Видимо вбирает в себя последубщие изменения newArr
 newArr1[i]=newArr1[i]+10  
for (var i=0; i<newArr1.length;i++) {newArr1[i]=newArr1[i]+10}
alert(oldArr1+" | "+newArr1)
}
   //-->
  </script>
 </head>
<body>
 <input type="button" onclick="g1()" value="Выполнить замену onClick">
<input type="button" onclick="g2()" value="Выполнить замену onClick">
</body>
</html>



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Sardar
Дата 2.12.2005, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(GIK @ 2.12.2005, 17:42)
Дак это что значит oldArr ссылается на newArr получается????

Не правильное мышление, и oldArr и newArr это ссылки на один массив (значение). Написав newArr=new Array(); мы запишем в newArr ссылку на новый массив, старый при этом никуда не исчезнет до тех пор, пока на него есть ссылки, т.е. счётчик ссылок больше нуля.

Изменяя массив по одной ссылке ты получишь те же изменения и в другой, так как обе указывают на одно и то же значение. Дважды повторил, если ещё не ясно, то почитай ман по PHP (ссылки), Java и другим языкам, всё почти также smile

Кстати из опыта заметил, что все примитивы должны передаваться по значению, а все обьекты, включая массивы и строки должны по ссылке, это эффективно и удобно.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
GIK
Дата 3.12.2005, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 6
Всего: 14



Так, я запутался.
Объесняю свою логику.
Если я правильно понял, то изменения касаются массива new Array() (т.е. изменение происходят в нем), на который в свою очередь ссылаются две переменные массива, которые не содержат значений а содержат ссылку.
ВЫВОД:
newArr ссылаясь на массив new Array() , изменяет значения в НЕМ, а поскольку oldArr ссылается на него же, он получает все изменения.
Я правильно, на это раз понял?
Если что извиняюсь за назойливость, все таки хочется докопатся до истины не влезая в книгу smile



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Sardar
Дата 3.12.2005, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Нет! smile
Представь себе два хранилища в памяти/мешка/таблицы как угодно, главное что их два и они в разных местах. Одно у нас под универсальные ссылки, другое под значения. Все примитивы сохраняються в ссылке, примитивы это целые и вещественные числа.

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

Видим что при таком раскладе у нас не может быть ссылки на другую переменную, но у нас могут быть несколько ссылок на одно и то же значение.

Разберём такой код:
Код
var oldArr; //создали ссылку, указывающую "в никуда", т.е. null

/* создали массив в хранилище для значений, по временной ссылке alert
показываем на окошко, после массив сразу убиваеться.
может показаться не эффективным, но это скрипты, ты видишь что современное
железо не обижаеться =) */
alert(['test','test 2', 'test 3']);

oldArr=['val 1', 'val 2', 'val 3']; //создали значение, ранее созданая ссылка указывает на новый массив

//создали ссылку newArr, записали ссылку из oldArr в newArr, теперь ОБЕ ссылки указывают
//на ОДНО значение, счётчик ссылок массива равен 2
var newArr=oldArr;

//теперь ссылка oldArr указывает на новое значение, счётчик ссылок предидущего массива
//равен 1
oldArr="test";

//предидущий массив потерян и назад его получить нельзя
//newArr более не ссылка, а хранит в себе 90, хотя это как посмотрят разработчики
//главное что поведение такое, что значение уже не ссылка, именно значение (копия)
newArr=90;

Помним что реализация интерпретаторов может сильно различаться, например var oldArr на самом деле не выделяет память под новую ссылку сразу, а зачастую все переменные в функции внутри блока создаються разом. Да и сама реализация ссылок и обьектных значений различаеться - НО! поведение "снаружи" такое же как описано выше.

Тобой названный подход я использую в своём Trilobite Scripting Language, скриптовая настройка над вебсервером в embedded окружении, eZ80 проц, 512кб памяти, поэтому нет ни мощей ни места на сборщик мусора и другие фичи smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
GIK
Дата 3.12.2005, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 6
Всего: 14



Так. Теперь в голове три реализации (смутно правда) вышеизложенной темы, осталось все сопоставить.
Но по ссыдкам и про счетчик все ясно, большое спасибо тебе smile .

Остадоль разобратся в изменении значений.
Цитата
//теперь ссылка oldArr указывает на новое значение, счётчик ссылок предидущего массива
//равен 1
oldArr="test";

значит получается что если мы присвоили бы не текстовое значение, а новое значение
например
oldArr=['n1','n2','n3']
то поменяли бы значения в массиве, по ссылке которая хранится в oldArr?, или же создался бы новый массив а счетчик старого контенера уменьшился бы на 1 (т.е. в данном случае исчез бы)?
Протестить это помоему нельзя, по крайней мере я не знаю как это сделать.



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
Sardar
Дата 3.12.2005, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Теоретически так:
Цитата(GIK @ 3.12.2005, 14:54)
создался бы новый массив а счетчик старого контенера уменьшился бы на 1 (т.е. в данном случае исчез бы)?

Практически если массивы реализован хештаблицей с ковшами из связанных списков, то интерпретатору проще отбросить ковшы с инфой, чем создавать всю хештаблицу по новой. То есть это зависит от реализации, но! поведение (а это главное smile ) такое, что создаёться новый массив с нуля и полностью.

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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Alex_B
Дата 14.6.2007, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 24.4.2007

Репутация: нет
Всего: 1



Код

<html>
<head>
  <title></title>
</head>

<body>
<script language="JavaScript">
var a = [];
var b = [1,2,3,4];

function doCopy(){
    a = b;
    alert(a);
    b.length = 0;
    alert(a);
}

doCopy();
</script>
</body>
</html>

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0740 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.