Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Удалить содержимое массива (https://javascript.ru/forum/misc/30077-udalit-soderzhimoe-massiva.html)

bes 23.07.2012 18:40

Цитата:

Сообщение от Deff
Ксать забавно - можно даже избегая замыканий иметь кучу переменных
не видимых в глобале

В данном случае все три - глобальные, или что имелось в виду?

x-yuri 23.07.2012 20:55

1) Есть ссылочные типы, и есть примитивные. Если в переменной содержится значение примитивного типа, значит в ней хранится само значение. В случае со значениями ссылочного типа в переменных хранятся ссылки на значение, т.е. сами данные хранятся отдельно.

Например, массив - ссылочный тип.

var a = [1, 2, 3];   // создали массив и записали ссылку на него в переменную a
var a = [];   // создали пустой массив и записали ссылку на него в переменную a
// старый массив никуда не исчез, просто на него сейчас нету ни одной ссылки


В результате, передавая переменные ссылочного типа в функции, ты можешь их изменить в отличие от примитивных типов:
var a = 1, b = [2, 3, 4];
function f(c, d) {
    c = 2;   // a не изменилась
    d.splice(0, 1);   // b изменилась
}
f(a, b);
alert([a].concat(b));


Примитивные типы - числа и true/false, по поводу строк - неизвестно, потому что их нельзя изменить. Остальное ссылочные типы. Number и Boolean - тоже ссылочные типы, потому что это объекты.

2) Сборщик мусора это такая штука, которая время от времени запускается и освобождает память, занятую переменными, которые нигде не используются.
var a = [1, 2, 3];   // создали массив и записали ссылку на него в переменную a
var a = [];   // создали пустой массив и записали ссылку на него в переменную a
// старый массив никуда не исчез, просто на него сейчас нету ни одной ссылки
// через какое-то время сборщик мусора освободит память, занятую массивом [1, 2, 3], другими словами старый массив "исчезнет"



Цитата:

Сообщение от 9xakep
devote,
Ну это тогда уже от задачи, мне может и надо очистить один массив

Следовательно, a = [] не очищает массив.

Цитата:

Сообщение от Deff
Ксать забавно - можно даже избегая замыканий иметь кучу переменных
не видимых в глобале

Именно поэтому рекомендуется создавать все переменные с помощью var. Если вы видите в коде переменные, объявленные без var, значит либо 1) автор очень умный, либо 2) автор очень "умный" ;)

bes 23.07.2012 21:30

Цитата:

Сообщение от x-yuri
Именно поэтому рекомендуется создавать все переменные с помощью var

Чтобы переменная не оказалась глобальной, ещё и в пределах некоторой функции.

x-yuri 23.07.2012 22:07

А что с циклическими ссылками? И что, сборщик мусора, основанный на подсчете ссылок используется во всех движках?

oneguy 24.07.2012 05:10

Цитата:

Сообщение от Дзен-трансгуманист
Хотите сказать, что в JS могут возникать ссылки на другие ссылки? Не верю, покажите пример.

В процессе работы программы на Джаваскрипте может случиться такое, что образуется некоторая группа объектов, каждый из которых имеет ссылку на него, но все ссылки на них принадлежат объектам из этой же группы, то есть эта группа объектов оказывается отрезанной от внешнего мира.
Пример 1:
var a={};
a.x=a;
a=null; //объект, на который раньше ссылалась переменная a оказывается отрезанным.

Пример 2:
var a={}, b={};
a.x=b;
b.x=a;
a=b=null; //объекты, на которые раньше ссылались переменные a и b, оказываются отрезанными от внешнего мира.

Будут ли подобраны эти объекты сборщиком мусора, я не знаю, самому интересно.

x-yuri 24.07.2012 15:32

Цитата:

Сообщение от Дзен-трансгуманист
Мусор-таки выметается - видно по индикатору свободной памяти в системе. Однако и сжирает 16 метров, то есть по 80 байт на объект.

По индикатору свободной памяти в системе? Почему не по памяти занятой процессом? Всегда подобные времяпровождения казались немного бессмысленными. Очевидно, что при удалении переменной, браузер на обязан освобождать память в систему. Т.е. должна присутствовать какая-то инертность. При чем алгоритм наверняка еще сложнее.

Цитата:

Сообщение от Дзен-трансгуманист
Просто не может такого быть, чтобы наличие ссылок определялось брутальным обходом - это была бы виселица попросту.

Кто говорит про брутальный обход? И я что-то не слышал, что mark and sweep сборщики признаны непригодными к использованию. В .net и java используются именно такие сборщики, насколько я знаю.

Aetae 24.07.2012 21:05

Цитата:

Сообщение от x-yuri (Сообщение 191244)
В .net и java используются именно такие сборщики, насколько я знаю.

И то и то слвится своим "быстродействием".)

x-yuri 25.07.2012 00:23

Цитата:

Сообщение от Aetae
И то и то слвится своим "быстродействием".)

Про java слышал, что до сих пор славится по инерции, типа оснований для этого уже нету. Про .net вообще не слышал такого.

Цитата:

Сообщение от Дзен-трансгуманист
Одно из свойств этой техники состоит в том, что на время сборки мусора исполнение программы полностью останавливается, что не всегда хорошо.

Цитата:

Сообщение от rsdn
Concurent GC – это второй вид оптимизации процесса сборки мусора. Его суть заключается в том, что процесс построения графа объектов ведется без приостановки управляемых потоков. Вместо этого запускается специальный GC-поток, строящий граф. Поскольку в любой момент управляемые потоки могут изменить граф и вообще пересечься с GC-потоком, требуется синхронизация со всеми операциями, модифицирующими управляемые ссылки. Естественно, что параллельный GC-поток и необходимость синхронизации (подробнее см. раздел «Барьер записи») не могут не замедлить процесс сборки мусора по сравнению с обычной схемой. Однако во многих случаях такое замедление незаметно. Зато это позволяет избавиться от паузы, вызванной построением графа объектов. Малый размер пауз выгоден для интерактивных приложений. Особенно в нем нуждаются GUI-приложения и игры. Не мудрено, что именно этот режим используется в .NET Framework по умолчанию.

http://www.rsdn.ru/article/dotnet/GC.xml#ENE

Там же написано про поколения, т.е. нету необходимости обходить все переменные.

Контрольный: почему они выбрали mark and sweep если подсчет ссылок такой весь из себя положительный?

Цитата:

Сообщение от Дзен-трансгуманист
Чем больше смотрю на работу браузеров, тем больше мне кажется, что почти все они сделаны через жопу.

Я думаю, надо написать свой браузер, чтобы понять разработчиков браузеров ;)

x-yuri 25.07.2012 12:31

Цитата:

Сообщение от Дзен-трансгуманист
Да, отличный способ избавиться от лишней головной боли в связи с неумением представить задачу в виде конечного автомата.

Вы так хорошо разбираетесь... вам надо непременно отправить своё резюме в microsoft или sun, пока они не просрали все полимеры. ;)


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