對應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; };