【问题标题】:Difference between Array.length = 0 and Array =[]?Array.length = 0 和 Array =[] 之间的区别?
【发布时间】:2011-06-15 19:26:46
【问题描述】:

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

【问题讨论】:

  • 为什么你的代码循环arr = arr + $(this).html();?如果要向数组中添加内容,则应改用 Array.push()
  • 这很有趣,因为已经有 9 个赞成的答案,但仍然 不清楚 OP 的意图是什么......
  • @Bolt - 我只是在这里给出了代码示例,原始代码将元素动态添加到数组中。我选择将元素附加到数组而不是 push()。这对我正在寻找的东西有很大影响吗?
  • 上面第二个代码块,是不是循环了?如果是这样,那么第一次执行它将清空数组,但是在第一次执行该代码块之后arr 将是对字符串的引用,因此从那时起arr.length 将没有任何效果(因为length 是 String 的只读属性)。 arr = [] 将在每次迭代开始时将 arr 转换回一个空数组,但随后您会立即将其再次转换为字符串。所以你要么破坏了你的代码,试图为这个例子简化它,要么你只是在做一些非常奇怪的事情:P

标签: javascript arrays


【解决方案1】:

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();

... 用 string 覆盖数组。

字符串的length 属性是只读的,因此将0 分配给它没有效果。

【讨论】:

    【解决方案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))时,您实际上清空了原始数组。

    【讨论】:

    • 哪些浏览器不支持array.length = 0
    • @ArthaeyAngosii:嘿,我不知道。显然,我很天真,喜欢在 2011 年 1 月用垃圾回答……谢谢你指出来;)。
    【解决方案3】:

    你确定它真的有效吗?

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

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

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

    (在 Opera 11 中测试)

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 2014-01-08
      • 1970-01-01
      • 2018-08-30
      • 2020-02-19
      • 2012-05-21
      • 2019-01-28
      • 2016-05-12
      • 2012-12-23
      相关资源
      最近更新 更多