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) автор очень "умный"