替代Array.prototype.indexOf的方案及自定义实现正确性验证(兼容IE8及更早)
嘿,我来帮你梳理这两个问题:
1. 替代Array.prototype.indexOf的方法
有几种实用的方式可以替代原生indexOf,不同场景下各有优劣:
- 手动for循环遍历:就像你正在尝试的方式,通过遍历数组逐个对比元素,找到匹配项的索引。这是兼容性最好的方案,能完美适配IE8及更早版本。
- 使用
Array.prototype.findIndex:这是ES6新增的方法,通过回调函数判断元素是否匹配,返回第一个符合条件的索引。但注意IE8及以下不支持该方法,若要兼容旧环境,还是得配合polyfill或手动循环。 - 用
some/forEach模拟:比如通过some遍历数组,找到匹配项时记录索引并终止遍历,本质逻辑和for循环类似,只是写法更简洁。 - 标准polyfill:可以直接使用MDN提供的
indexOf官方polyfill,它会先检测浏览器是否原生支持,不支持时再注入兼容实现,行为完全对齐原生方法,是最规范的兼容方案。
2. 你编写的替代代码是否正确?
结论是不完全正确,有两处需要修正:
循环终止条件错误
你用了i <= a.length,但数组的有效索引范围是0到a.length - 1,当i等于a.length时,a[i]是undefined。这会导致两个问题:- 多执行一次无意义的循环;
- 如果要查找的
b是undefined,会错误地把indexb设为a.length,和原生indexOf的行为不符(原生会返回数组中undefined元素的实际索引,或找不到时返回-1)。
正确的终止条件应该是i < a.length。
未找到匹配项的返回值不符合标准
原生indexOf在找不到元素时会返回-1,但你的代码中如果没有匹配项,indexb会是undefined,这和原生行为不一致。建议初始化indexb为-1,仅在找到匹配项时更新它。
修正后的代码示例:
var a = ["i", "you", "him"]; var b = "him"; var indexb = -1; // 初始化默认返回值为-1 for (var i = 0; i < a.length; i++) { // 修正终止条件 if (b == a[i]) { indexb = i; break; } } console.log(indexb); // 找到时返回2,未找到时返回-1,和原生一致
另外你提到测试大数组耗时2ms,这个表现很不错,for循环本身就是数组遍历中性能较好的方式,非常适合旧浏览器环境。
内容的提问来源于stack exchange,提问作者ŞükSefHam
相关产品推荐
相关产品推荐

