Array.length = 0 和 Array = [] 有什么区别?

74

有人能解释一下它们之间的概念上的区别吗?从某个地方读到第二个会通过销毁对现有数组的所有引用来创建新数组,而.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 的代码,它可以正常工作。有人能解释一下这里发生了什么吗。


6
为什么你的代码使用arr = arr + $(this).html();进行循环?如果你想要向数组中添加内容,应该使用Array.push()方法。 - BoltClock
1
这很有趣,因为已经有一个得到9个赞的答案,但是仍然不清楚OP的意图是什么... - gblazex
@Bolt - 我在这里只是提供了代码示例,原始代码会动态地将元素添加到数组中...我选择将元素附加到数组而不是使用push()。这对我所寻找的有很大的区别吗? - Srikanth Rayabhagi
1
上面的第二个代码块,它是在循环中吗?如果是这样,那么第一次执行它时,它将清空数组,但在该代码块的第一次执行之后,arr 将是一个字符串的引用,因此从那时起 arr.length 将不会有任何效果(因为 length 是 String 的只读属性)。arr = [] 将在每次迭代开始时将 arr 转换回空数组,但然后你立即又将其转换为字符串。所以你要么在尝试简化示例时破坏了代码,要么就是在做非常奇怪的事情 :P - Joe Dyndale
可能是如何在JavaScript中清空数组?的重复问题。 - Shadow The Spring Wizard
3个回答

107

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没有任何效果。

3
这里的区别可以通过以下示例最好地展示出来:
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)),你实际上是在清空原始数组。


1
哪些浏览器不支持 array.length = 0 - Arthaey
1
@ArthaeyAngosii:嘿,我不知道有这样的事情。显然,我在2011年1月时很天真,喜欢用废话回答问题...感谢你指出来;)。 - Matt

-1
你确定它真的有效吗?
我在这里做了一个小实验,试图将一个数组与一个字符串“相加”,结果得到了一个字符串。
function xyz(){
    var a = [];
    alert(typeof(a+$("#first").html()));
    // shows "string"
}

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

(在Opera 11中测试过)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接