我注意到在我的javascript中,如果我创建一个空数组,将其作为关联数组循环,并打印出内容,它将返回类似于Array Object类本身的函数。这是我的代码:
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...
我注意到如果我使用for循环遍历数组,即:
for(var i = 0; i < test.length; i++)
浏览器不打印任何内容(这应该是什么)
任何人都可以解释为什么当我以另一种方式遍历它时,我从空数组中获取了一堆函数?如果它很重要,我正在使用mootools v1.3。提前致谢。
答案 0 :(得分:6)
摆脱任何扩展Array.prototype
。扩展默认类型的原型(如Array
或Object
)很糟糕,会导致类似的问题。
在保留原型扩展的同时避免问题的简单方法是添加if(!test.hasOwnProperty(i)) continue;
检查。 (obj.hasOwnProperty(key)
是true
,如果属性位于对象本身而不仅仅是其原型链中的某个位置)
除此之外,在迭代数组时不应使用for..in
循环 - 在这种情况下使用for(var i = 0; i < array.length; i++)
。
答案 1 :(得分:0)
派对有点晚了,但我在试图找到办法时发现了这一点。 这就是我想出来的。
function createArrayOfEmptyObjects(size) {
return Array.apply(0, new Array(size).map(function(){return {};});
}
顾名思义,它将创建一个空的对象数组,直到提供的大小。