2012-02-22 39 views
3

在PHP中,如果你这样做如何防止在Javascript中创建额外的数组元素?

$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编码器。

编辑:

我正在使用谷歌地图V2和markerManager的应用程序。代码已经运行了很长时间,但Chrome(17.0.963.56米)突然出现一个问题,即标记似乎被复制(或更多),然后渲染移动的标记完全错误,通常会导致浏览器冻结。使用Firebug查看DOM,我在markerManager中的grid_变量下发现了数组中“未定义”元素的碎片。我认为,如果我可以删除这些,我可能会有更多的代码,无论它是否修复了标记问题。谢谢。

回答

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 
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 ]); 
    } 
} 
+0

感谢(非常快)的答案。它们非常有意义。所以这是一个补充问题....是否有人在Google映射中熟悉MarkerManager?它似乎以我展示的方式制作阵列,导致巨大的内存使用量。或者,也许我错了? – Pete 2012-02-22 17:13:02

+0

添加您的问题作为主要问题的编辑或(甚至更好)为此打开一个新的问题。至少我不知道备用阵列的内存使用情况。 – Sirko 2012-02-22 17:22:01

+1

@Pete数组可能有这样的长度,但通常在浏览器中不使用数组数据结构(与数组数据类型相反)来存储稀疏数组(即,其中有洞的数组 - 您的代码不会实际上创建一个名为'0','1','2','3',...,'9'的属性,所以内存使用不是O(n),其中n是长度。通常情况下,内存使用量为O(n),其中n是类似数组属性的数量(小于或等于该长度)。 – gsnedders 2012-02-22 17:22:07

相关问题