Разница между Array.length = 0 и Array = []? - PullRequest
66 голосов
/ 26 января 2011

Может кто-нибудь объяснить концептуальную разницу между ними обоими.Где-то читал, что второй создает новый массив, уничтожая все ссылки на существующий массив, а .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 =[]вместо arr.length=0 работает нормально.Может кто-нибудь объяснить, что здесь происходит.

Ответы [ 3 ]

84 голосов
/ 26 января 2011

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 голосов
/ 26 января 2011

Разница здесь лучше всего демонстрируется в следующем примере:

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)), вы фактически очищаете исходный массив.

0 голосов
/ 26 января 2011

Вы уверены, что это действительно работает?

Я провел небольшой эксперимент, и попытка "добавить" массив со строкой привела к строке.*http://www.jsfiddle.net/4nKCF/

(проверено в Opera 11)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...