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