Javascript 分配Array.prototype.indexOf后,是什么原因导致中的for…出现此错误?
当我能够用最少的代码重现一个bug时,我感到很惊讶。请注意,在这个极简示例中,未调用Array.indexOf。还请注意,我尝试了几种不同的indexOf实现,包括stackoverflow.com中的几种 错误是,当for…in在IE中执行时,会显示三个警报:“indexOf”、“0”和“1”。在FF中,正如人们所期望的,只有两个(“0”、“1”)出现Javascript 分配Array.prototype.indexOf后,是什么原因导致中的for…出现此错误?,javascript,internet-explorer,Javascript,Internet Explorer,当我能够用最少的代码重现一个bug时,我感到很惊讶。请注意,在这个极简示例中,未调用Array.indexOf。还请注意,我尝试了几种不同的indexOf实现,包括stackoverflow.com中的几种 错误是,当for…in在IE中执行时,会显示三个警报:“indexOf”、“0”和“1”。在FF中,正如人们所期望的,只有两个(“0”、“1”)出现 var testArray=['Foo','Bar']; if(!Array.prototype.indexOf){ Array.proto
var testArray=['Foo','Bar'];
if(!Array.prototype.indexOf){
Array.prototype.indexOf=函数(obj,fromIndex){
if(fromIndex==null){
fromIndex=0;
}else if(从索引<0){
fromIndex=Math.max(0,this.length+fromIndex);
}
for(var i=fromIndex,j=this.length;i
有人能解释一下吗?我已经把代码改成了,而这样我就不必担心了,但这一次真的让我难堪了。它让我想起了c语言中的内存溢出错误。请参阅雅虎网站上的“”!用户界面博客
您的代码在Firefox中正常工作的原因是您没有在Firefox中添加自己的indexOf
方法。for in
循环迭代对象原型链中的所有键,包括您添加的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
循环来迭代数组。in
循环中的用于迭代对象中的键
史蒂夫为。。in
用于循环对象属性,而不是数组
坚持标准:
for (var i = 0, l = myArray.length; i < l; ++i) { .. }
for(var i=0,l=myArray.length;i
更多信息,请访问:
for…in
循环不会迭代内置属性。这些方法包括对象的所有内置方法,例如String的indexOf方法或Object的toString方法。但是,循环将迭代所有用户定义的属性(包括覆盖内置属性的任何属性)
虽然使用它作为迭代数组的一种方式可能很有诱惑力,但这不是一个好主意。for…in语句除了数组元素外,还迭代用户定义的属性,因此如果修改数组的非整数或非正属性(例如,通过向其添加“foo”属性,甚至通过向array.prototype添加方法或属性),for…in语句将返回用户定义属性的名称以及数字索引
谢谢你;这正是我需要的。你真的不应该在数组中使用。请看我答案中的链接。@Steve:既然没有任何问题,我就不会用“hasOwnProperty()”来修复它。;-)@托马拉克:明白了!我把它改成了“解决方案”。正如我在问题中提到的,这是一个极简主义的例子,只再现了这个问题;但你的观点很好。为了确保我给出了正确的分数,你的答案是100%准确;但我需要的是史蒂夫在回答中提供的关于为什么问题会发生的初步信息。谢谢你的帮助!
for (var i = 0, l = myArray.length; i < l; ++i) { .. }