zoukankan      html  css  js  c++  java
  • 使用Array.prototype.indexOf()的几点注意

    对应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;
    };
  • 相关阅读:
    《Java程序设计》第七次学习总结
    《Java程序设计》第六次学习总结
    实验二:Java面向对象程序设计
    《信息安全系统设计基础》第二次学习总结
    《信息安全系统设计基础+Linux 内核分析》第一次学习总结
    《Java程序设计》第五次学习总结
    《Java程序设计》第四次学习总结
    《Java程序设计》第三次学习总结
    next_permutation 函数
    POJ 3268 (dijkstra算法)
  • 原文地址:https://www.cnblogs.com/cuew1987/p/4075162.html
Copyright © 2011-2022 走看看