【问题标题】:Looping through empty javascript array returns array object functions循环遍历空 javascript 数组返回数组对象函数
【发布时间】:2011-08-16 05:55:53
【问题描述】:

我注意到在我的 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。提前致谢。

【问题讨论】:

  • var test = []; 会更好,而不是使用new Array()
  • 以防万一,这是什么浏览器?

标签: javascript arrays loops for-loop associative


【解决方案1】:

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

在保留原型扩展的同时规避问题的简单方法是添加if(!test.hasOwnProperty(i)) continue; 检查。 (obj.hasOwnProperty(key)true 如果属性在对象本身上,而不仅仅是在其原型链的某个地方)

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

【讨论】:

  • 这在数组是关联的并且您不能循环遍历键的情况下非常有用。谢谢,我今天学到了新东西!
  • “关联数组”是 JavaScript 中的对象——这就是为什么扩展 Object.prototype 也是不好的。是的,在这种情况下使用for..in 非常好,并且在不扩展原型时它实际上可以正常工作并且没有额外的代码。
【解决方案2】:

聚会有点晚了,但我在尝试找到方法时发现了这一点。 这就是我想出的。

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

顾名思义,它将创建一个由空对象组成的数组,最大为提供的大小。

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多