关于如何将实现索引的实现为阵列原型,以便它在Internet Explorer下起作用,但是我偶然发现了一个似乎没有解决我到目前为止的任何地方。

使用非常好的商定 在MDC实施, ,我现在有以下代码问题:

// indexOf support for IE (from MDC)
if (!Array.prototype.indexOf)
{
    Array.prototype.indexOf = function(elt /*, from*/)   
    {
        var len = this.length >>> 0;

        var from = Number(arguments[1]) || 0;
        from = (from < 0) ? Math.ceil(from) : Math.floor(from);
        if (from < 0)
            from += len;

        for (; from < len; from++)
        {
            if (from in this && this[from] === elt)  
                return from;
        }
        return -1;
    };
}

var i = [1,2,3,4];

for (j in i)
{
    alert(i[j]);
}

我希望会收到4个警报,每个警报包含数组的一个元素之一。在Firefox和Chrome中,这正是我所看到的,但是在IE8中,我获得了一个包含索引功能代码的其他警报。

可以做些什么来避免这种情况?

有帮助吗?

解决方案

那是因为您编辑array.protype,因此创建的任何数组都继承了自定义的可见方法 indexOf “在”命令中可以看到。

for..in JavaScript中的构造不像PHP的foreach一样 - 它不仅迭代数组中的所有项目,而且还迭代数组对象可能具有的所有方法和属性(JavaScript中的数组实际上是“伪装”对象的)。天然方法是看不见的 for..in 构造但所有自定义添加都不是。

在您的示例中,任何数组看起来都这样:

Array:
- [0] value
- [1] value
- [2] value
- ..
- [N] value
- [IndexOf] value

为了避免非遗传的继承方法和属性,您可以使用该方法 hasOwnProperty():

for (j in j){
    if(i.hasOwnProperty(j){
        alert(i[j])
    }
}

hasOwnProperty 检查键是否未继承并属于实际对象。这样,只有所需的值通过。

其他提示

发生这种情况是因为在IE中,由于该方法不存在,因此将其添加到 Array.prototype, ,它仍然是枚举的。

对于用数组(通常像任何类似阵列的对象)的锅,我 不建议 使用 for...in 陈述。

为什么 ?

  • for...in 陈述是为了 枚举 对象属性。
  • for...in 声明正如您注意到的那样爬升原型链。
  • 迭代的顺序可以是任意的,在数组上进行迭代可能不会访问数字顺序的元素。

最简单的方法,平原 for 环形:

for (var j = 0; j < i.length; j++) {
    alert(i[j]);
}

也可以看看:

您可以尝试添加:

for (j in i) {
    if (i.hasOwnProperty(j)) { 
        alert(j); 
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top