【问题标题】:How can I prevent extra array elements being created in Javascript?如何防止在 Javascript 中创建额外的数组元素?
【发布时间】:2012-02-22 17:03:14
【问题描述】:

在 PHP 中,如果你这样做

$var = array(); 
$var[5000] = 1;
echo count($var);

它打印 1。

在 JS 中,它会产生“缺失”的元素。

<script type="text/javascript">
    var fred = [];
    fred[10] = 1;
    alert(fred.length);
</script>

警报“11”。

我可以防止这种情况吗?它对任何事情都有好处吗?我是一名试图适应 Javascript 的 PHP 编码员。

编辑:

我正在开发一个使用 Google Maps v2 和 markerManager 的应用程序。该代码已经运行了很长时间,但是在 Chrome (17.0.963.56 m) 中突然出现了一个问题,其中标记似乎重复(或更多),然后渲染移动的标记完全错误,通常随后浏览器冻结。使用 Firebug 查看 DOM,我在 markerManager 的 grid_ 变量下的数组中发现了数以万计的“未定义”元素。我想,如果我可以删除这些,我可能会有更流畅的代码,无论它是否解决了标记问题。谢谢。

【问题讨论】:

    标签: javascript arrays elements extra


    【解决方案1】:

    作为 PHP 编码人员,您习惯于数组键是相当随意的。然而,在 JavaScript 中,如果您以数字方式分配一个不存在的数组元素,则该数组将分配有空元素,直到您创建的那个。这就是你发现的行为。另一方面,由{} 而不是[] 表示的对象,接受任意属性名称(谨慎)并且功能更接近于您习惯的PHP 数组结构的功能。这并不是说 JavaScript 对象(或对象字面量)直接类似于 PHP 数组......

    如果您想要的是一个键名为“10”的数据结构,那么这就是对象字面量的工作(尽管以数字方式命名对象属性并不是很好的做法。

    var fred = {};
    fred["10"] = 1;
    

    注意,处理对象字面量的更正常语法是object.property 表示法,但这对数字属性无效:

    // name as a property
    fred.name = "fred";
    
    // Syntax error...
    fred.10 = 10;
    
    // Use [] notation for numeric properties:
    fred["10"] = 10;
    

    但是,对象文字没有length 属性。所以你不能这样做:

    fred.length;
    // undefined
    

    【讨论】:

      【解决方案2】:

      您可以使用对象而不是数组,但您会失去数组的一些好处,例如访问length 属性。

      <script type="text/javascript">
          var fred = {};
          fred['10'] = 1;
          // alert(fred.length);  // won't work anymore
      </script>
      

      另一方面,不会生成额外的条目,并且对特定值的访问几乎与在数组中的工作方式相同。如果要遍历所有值,请使用以下内容:

      for( var el in fred ) {
        if ( fred.hasOwnProperty( el ) ) {
          alert( fred[ el ] );
        }
      }
      

      【讨论】:

      • 感谢(非常快速)的回答。它们很有意义。所以这是一个补充问题....有人熟悉谷歌地图中的 MarkerManager 吗?它似乎以我展示的方式制作数组,导致大量内存使用。还是我错了?
      • 将您的问题添加为主要问题的编辑,或者(甚至更好)为此打开一个新问题。至少我不知道备用数组的内存使用情况。
      • @Pete 数组可能有这个长度,但通常在浏览器中不使用数组数据结构(与数组数据类型相反)来存储稀疏数组(即,有孔的数组)它们——您的代码实际上并没有创建名为 0123、...、9) 的属性,因此内存使用量不是 O(n),其中 n 是长度.通常,内存使用量为 O(n),其中 n 是类数组属性的数量(小于或等于长度)。
      • 感谢大家。请原谅我以迂回的方式提问——我已经习惯了 JS 和这个网站!
      猜你喜欢
      • 2010-09-17
      • 2017-07-11
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多