使用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;
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM