3

我是 Prototype 的新手,但我总是使用 jQuery。我有一个需要使用 jQuery 和 Prototype 的网站。我在使用以下代码时遇到问题:

var x = [];
console.log(x);
for (var l in x)
{
console.log(l);
}

运行此代码,x 包含以下内容:

    每个
    每片
    全部
    任何
    搜集
    探测
    找到所有
    选择
    grep
    包括
    成员
    inGroupsOf
    注入
    调用
    最大限度
    分钟
    分割
    采摘
    拒绝
    排序方式
    数组
    条目
    压缩
    尺寸
    检查
    寻找
    _撤销
    _每个
    清除
    第一的
    最后的
    袖珍的
    展平
    没有
    独特的
    相交
    克隆

预期结果(无原型):

没有子对象

Prototype 这样做的任何原因,以及如何阻止它?!

谢谢

4

3 回答 3

7

你不应该使用for...in数组,这正是原因。

for...in循环遍历对象的所有属性。这包括其属性(在本例中为数组索引),以及添加到prototype.

对于数组,只需使用普通for循环。

var x = [];
console.log(x);
for(var i = 0, len = x.length; i<len; i++){
    console.log(i, x[i]);
}

注意:我这样做var i = 0, len = x.length是因为它只length从数组中抓取一次,而不是每次迭代。它可能会更快。

于 2012-07-16T14:51:40.210 回答
5

你不应该for..in在数组上使用,你应该使用for( i=0; i<length; i++). 但除此之外:

for( l in x) {
    if( x.hasOwnProperty(l)) {
        // l is a property of your object
    }
}

这基本上忽略了循环的原型链。

于 2012-07-16T14:52:20.333 回答
0

使用时,for ... in您将枚举数组的所有(可枚举)属性,而不仅仅是数字索引。

由于 Prototype.js 向其中添加了许多新函数Array.prototype并且未能将它们标记为不可枚举,因此它们也都出现在属性列表中。

于 2012-07-16T15:07:03.630 回答