Подтвердить что ты не робот

Разница между 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 =[], он отлично работает. Может кто-нибудь объяснить, что происходит здесь.

4b9b3361

Ответ 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 сохраняет ссылку на массив и удаляет все элементы из этого массива, не создавая новую ссылку.