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


70

有人可以解释一下两者之间的概念差异。阅读某个地方,第二个地方通过销毁对现有数组的所有引用来创建一个新数组,而.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 2011年

@Bolt-我只是在此处提供了代码示例,原始代码将元素动态添加到array ..我选择将元素添加到array而不是push()。这对我寻找的东西有很大的不同吗?
Srikanth Rayabhagi 2011年

1
上面的第二个代码块,是否在循环中?如果是这样,则在第一次执行时将清空该数组,但是在该代码块的第一次执行之后arr将是对字符串的引用,因此从那时起arr.length将没有任何效果(length只读)字符串的属性)。arr = []arr在每次迭代开始时转换回一个空数组,但随后您立即将其再次转换为字符串。因此,您可能在尝试简化本示例的过程中破坏了代码,或者只是在做非常奇怪的事情:P
Joe Dyndale 2012年

Answers:


92

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 2013年

1
@ArthaeyAngosii:嘿,我不知道。显然,我很天真,在2011年1月,我很享受用垃圾来回答的问题……感谢您指出来;)。
马特

-1

您确定它确实有效吗?

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

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

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

(在Opera 11中测试)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.