繁体   English   中英

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

[英]How can I prevent extra array elements being created in Javascript?

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

作为一个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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM