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