如何防止在Javascript中创建额外的数组元素?

时间:2012-02-22 17:03:14

标签: javascript arrays elements extra

在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_变量下的数组中找到了大量的“未定义”元素。我想,如果我可以删除它们,我可能会有更光滑的代码,无论它是否修复了标记问题。感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用对象而不是数组,但是您可以放弃数组的一些好处,例如访问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 ] );
  }
}