gpt4 book ai didi

javascript - 分配 Array.prototype.indexOf 后 for...in 导致此错误的原因是什么?

转载 作者:行者123 更新时间:2023-12-03 16:45:52 25 4
gpt4 key购买 nike

当我能够用最少的代码重现错误时,我感到很惊讶。请注意,在这个极简示例中,没有调用 Array.indexOf。另请注意,我已经尝试了几种不同的 indexOf 实现,包括来自 stackoverflow.com 的几种。

错误是,当 for...in 在 IE 中执行时,会显示三个警告:“indexOf”、“0”和“1”。在 FF 中,正如人们所期望的那样,只有两个 ("0", "1") 出现。

<html>
<body onLoad="test();">
<script language="javascript">
var testArray = ['Foo', 'Bar'];

if(!Array.prototype.indexOf) {
Array.prototype.indexOf = function (obj, fromIndex) {
if (fromIndex == null) {
fromIndex = 0;
} else if (fromIndex < 0) {
fromIndex = Math.max(0, this.length + fromIndex);
}
for (var i = fromIndex, j = this.length; i < j; i++) {
if (this[i] === obj)
return i;
}
return -1;
};
}

function test() {
var i;

for(i in testArray) {
alert(i);
}
}
</script>
</body>
</html>

谁能解释一下?我已经将我的代码更改为使用 while,所以我没有受到攻击,但这确实让我感到难过。这让我想起了 c 中的内存溢出错误。

最佳答案

请参阅 Yahoo! 上的“for in Intrigue”用户界面博客。

您的代码在 Firefox 中按预期工作的原因是您没有在 Firefox 中添加自己的 indexOf 方法。 for in 循环遍历对象原型(prototype)链中的所有键,包括您添加的 indexOf 方法。 Douglas Crockford 建议采用以下解决方案:

for (var p in testArray) {
if (testArray.hasOwnProperty(p)) {
alert(testArray[i]);
}
}

或者,您可以只过滤掉函数:

for (var p in testArray) {
if (typeof testArray[p] !== "function") {
alert(testArray[i]);
}
}

此外,正如“nickf”指出的那样,最好不要使用 for in 循环来遍历数组。 for in 循环旨在迭代对象中的键。

史蒂夫

关于javascript - 分配 Array.prototype.indexOf 后 for...in 导致此错误的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/780422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com