2011-04-30 58 views
2

我注意到,在我的javascript,如果我创建一个空数组,遍历它作为一个关联数组,并打印出的内容,返回结果是什么样子,从数组对象功能课本身。这里是我的代码:通过空的JavaScript数组循环返回数组对象的功能

var test = new Array(); 
for(var i in test){ 
    document.write(i + " " + test[i] + "<br>"); 
} 
alert(test.length); // this returns 0 

上面的代码打印如下(我省略了一些输出,因为它是一种长)

$family function(){return u; } 
$constructor function Array() { [native code] } 
pop function pop() { [native code] } 
push function push() { [native code] } 
reverse function reverse() { [native code] } 
shift function shift() { [native code] } 
sort function sort() { [native code] } 
splice function splice() { [native code] } 
unshift function unshift() { [native code] } 
concat function concat() { [native code] } 
join function join() { [native code] } 
slice function slice() { [native code] } 
indexOf function indexOf() { [native code] } 
etc... 

我注意到,如果通过阵列的I循环使用for循环即:

for(var i = 0; i < test.length; i++) 

浏览器不会打印出任何东西(这是应该发生的事情)

任何人都可以解释为什么我从一个空数组中获得一堆函数时,我通过其他方式循环?万一它很重要,我使用mootools v1.3。提前致谢。

+0

'VAR测试= [];'会更好,而不是使用'新的Array()' – ThiefMaster 2011-04-30 22:34:22

+0

以防万一,什么浏览器做到这一点? – 2011-04-30 22:59:29

回答

6

摆脱任何扩展Array.prototype的。扩展像ArrayObject这样的默认类型的原型是不好的,会导致类似的问题。

最简单的方式来规避问题,同时保持了原型扩展是添加if(!test.hasOwnProperty(i)) continue;检查。 (obj.hasOwnProperty(key)true如果属性是对象本身,而不是只在它的原型链某处)

除此之外,遍历数组时,你不应该使用for..in循环 - 在这种情况下使用for(var i = 0; i < array.length; i++)

+0

这对于数组是关联的情况非常适用,并且您无法通过键循环。谢谢,我今天学到了一些新东西! – Mel 2011-05-01 01:30:55

+0

“关联数组”是JavaScript中的对象 - 这就是为什么扩展Object.prototype也不好。是的,在这种情况下,使用'for..in'是完全正确的,并且在不扩展原型时它实际上没有问题和附加代码。 – ThiefMaster 2011-05-01 09:48:29

0

有点迟到了,但我发现这一点的同时试图找到一种方式来做到这一点。 这就是我想出的。

function createArrayOfEmptyObjects(size) { 
    return Array.apply(0, new Array(size).map(function(){return {};}); 
} 

它将,顾名思义,创建空对象的数组高达所提供的尺寸。