Array.length = 0和Array = []之间的区别?

时间:2011-01-26 11:52:03

标签: javascript arrays

有人可以解释两者之间的概念差异。通过销毁对现有数组的所有引用来读取第二个创建新数组的地方,而.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替换代码,那么它可以正常工作。任何人都可以解释这里发生的事情。

4 个答案:

答案 0 :(得分:84)

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无效。

答案 1 :(得分: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))时,您实际清空原始数组。

答案 2 :(得分:-1)

你确定它真的有用吗?

我在这里做了一个小实验,尝试用String添加一个数组导致了一个字符串。

function xyz(){
    var a = [];
    alert(typeof(a+$("#first").html()));
    // shows "string"
}

http://www.jsfiddle.net/4nKCF/

(在Opera 11中测试)

答案 3 :(得分:-1)

设置arr = []会创建一个新引用和一个新数组,但是旧数组arr = [1,2,3]仍存在于内存中。垃圾收集器将清理它。

arr.length = 0保留数组引用,并从该数组中删除所有元素,而无需创建新引用。