3

在 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_ 变量下的数组中发现了数以万计的“未定义”元素。我想,如果我可以删除这些,我可能会有更流畅的代码,无论它是否解决了标记问题。谢谢。

4

2 回答 2

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
于 2012-02-22T17:06:30.400 回答
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 ] );
  }
}
于 2012-02-22T17:05:39.603 回答