对应indexOf这个方法,在日常开发中比较常见的应该是String.prototype.indexOf()方法,Array.prototype.indexOf()方法和其有很大的相似性,本文不想去描述其的基本用法,而是去探究在使用中需要考虑的一些问题。

一、性能

在数组元素少的情况下,我们虽然只是跳过一个元素来检索,性能微不足道,但是当我们正在处理数以千计的元素,如果使用indexOf()的第二个参数,你可能获得性能上的显著提升。

二、全等(===)

indexOf方法使用全等(===)来判断一个元素是否符合您的搜索。搜索字符串及数字可能没有问题,但是搜索对象和数组可能会有问题,看下面一个实例:

var arr = [{
"name": "Benjamin",
"blog": "http://www.zuojj.com"
},{
"name": "John",
"blog": "http://www.john.com"
}],
index = arr.indexOf({
"name": "Benjamin",
"blog": "http://www.zuojj.com"
});

//Outputs: -1
console.log(index);

实例输出结果为-1,为什么?其实就是判断两个对象是否相等的问题,在本专题中,写过一篇文章Javascript 判断对象是否相等,大家可以看看。我们可以判断两个对象的属性和值是否相等,但是不等判断两个对象是否相等,除非它们指向相同的地址。 修改上例,可以得到我们期望的结果:

var e1 = {
"name": "Benjamin",
"blog": "http://www.zuojj.com"
},
e2 = {
"name": "John",
"blog": "http://www.john.com"
},
arr = [e1, e2],
index = arr.indexOf(e1);


//Outputs: 0
console.log(index);

三、兼容性

Array.prototype.indexOf()方法是在ES5规范中添加的,同filter/every/some/reduce/map等方法一样,在IE8及以下浏览器不支持,可以使用下面的Polyfill或者一些封装库Underscore or Lo-Dash来兼容。

Array.prototype.indexOf = Array.prototype.indexOf || function (searchElement, fromIndex) {
if ( this === undefined || this === null ) {
throw new TypeError( '"this" is null or not defined' );
}

var length = this.length >>> 0; // Hack to convert object.length to a UInt32

fromIndex = +fromIndex || 0;

if (Math.abs(fromIndex) === Infinity) {
fromIndex = 0;
}

if (fromIndex < 0) {
fromIndex += length;

if (fromIndex < 0) {
fromIndex = 0;
}
}

for (; fromIndex < length; fromIndex++) {
if (this[fromIndex] === searchElement) {
return fromIndex;
}
}

return -1;
};

更多相关文章

  1. 利用javascript动态加载头部出现点击事件与hover事件无效解决方
  2. 类似jQuery的extend扩展方法的实现
  3. 在jQuery的$.post中调用函数时,Undefined不是对象
  4. 如何在onchange()事件后调用的方法中将焦点设置为输入字段?
  5. 如何使函数等到对象的值未定义为js setTimeout
  6. 如何在javascript中合并2个对象[重复]
  7. JavaScript学习07 内置对象
  8. jsPDF中使用.text()方法的字母间距
  9. javascript 截取字符串方法汇总

随机推荐

  1. 在jQuery的$.post中调用函数时,Undefined
  2. 两个svg文件用javascript合并的问题?
  3. Net.Socket实例不会在NodeJS中消失
  4. JS在页面加载时候onload与匿名自调用函数
  5. js闭包与变量
  6. React:更新列表中的一个项目而不重新创建
  7. 带有无线电的JavaScript条件字段不起作用
  8. Sails.js套接字。好的和坏的一面。与sock
  9. JavaScript学习笔记:你必须要懂的原生JS(一
  10. IE下javascript cookie path设置Bug