Разница между Array.length = 0 и Array = []?
Может кто-нибудь объяснить концептуальную разницу между обоими из них. Читайте где-нибудь, что второй создает новый массив, уничтожая все ссылки на существующий массив, а .length = 0 просто опустошает массив. Но в моем случае это не сработало
//Declaration
var arr = new Array();
Ниже приведен код цикла, который выполняется снова и снова.
$("#dummy").load("something.php",function(){
arr.length =0;// expected to empty the array
$("div").each(function(){
arr = arr + $(this).html();
});
});
Но если вместо arr.length=0
заменить код на arr =[]
, он отлично работает. Может кто-нибудь объяснить, что происходит здесь.
Ответы
Ответ 1
foo = []
создает новый массив и присваивает ему ссылку на переменную. Любые другие ссылки не затрагиваются и все еще указывают на исходный массив.
foo.length = 0
изменяет сам массив. Если вы обращаетесь к нему через другую переменную, вы все равно получаете модифицированный массив.
Где-то читал, что второй создает новый массив, уничтожая все ссылки на существующий массив
Это назад. Создает новый массив и не уничтожает другие ссылки.
var foo = [1,2,3];
var bar = [1,2,3];
var foo2 = foo;
var bar2 = bar;
foo = [];
bar.length = 0;
console.log(foo, bar, foo2, bar2);
дает:
[] [] [1, 2, 3] []
arr.length =0;// expected to empty the array
и он очищает массив, по крайней мере, в первый раз. После первого раза вы делаете это:
arr = arr + $(this).html();
... который переписывает массив строкой.
Свойство length
строки доступно только для чтения, поэтому присвоение ему 0
не имеет никакого эффекта.
Ответ 2
Различие здесь лучше всего показано в следующем примере:
var arrayA = [1,2,3,4,5];
function clearUsingLength (ar) {
ar.length = 0;
}
function clearByOverwriting(ar) {
ar = [];
}
alert("Original Length: " + arrayA.length);
clearByOverwriting(arrayA);
alert("After Overwriting: " + arrayA.length);
clearUsingLength(arrayA);
alert("After Using Length: " + arrayA.length);
Здесь можно увидеть живое демо: http://www.jsfiddle.net/8Yn7e/
Когда вы устанавливаете переменную, указывающую на существующий массив, чтобы указывать на новый массив, все, что вы делаете, - это нарушение связи, которую переменная имеет в этом исходном массиве.
Когда вы используете array.length = 0
(например, другие методы, например array.splice(0, array.length)
), вы фактически освобождаете исходный массив.
Ответ 3
Вы уверены, что это действительно работает?
Я сделал небольшой эксперимент здесь и попытался "добавить" массив со строкой, получив строку.
function xyz(){
var a = [];
alert(typeof(a+$("#first").html()));
// shows "string"
}
http://www.jsfiddle.net/4nKCF/
(тестируется в Opera 11)
Ответ 4
Установка arr = []
создает новую ссылку и новый массив, но старый массив arr = [1,2,3]
все еще существует в памяти. Сборщик мусора очистит это.
Принимая во внимание, что arr.length = 0
сохраняет ссылку на массив и удаляет все элементы из этого массива, не создавая новую ссылку.