array.indexOf

array.indexOf

indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。

注意:对于String方法,请参阅String.prototype.indexOf()

var a = [2, 9, 9]; a.indexOf(2 // 0 a.indexOf(7 // -1 if (a.indexOf(7) === -1) { // element doesn't exist in array }

语法

arr.indexOf(searchElement[, fromIndex])

参数

searchElement

返回值

首个被找到的元素在数组中的索引位置; 若没有找到则返回 -1

描述

indexOf使用strict equality(无论是 ===, 还是 triple-equals操作符都基于同样的方法)进行判断searchElement与数组中包含的元素之间的关系。

示例

使用indexOf()

以下例子使用indexOf()方法确定多个值在数组中的位置。

var array = [2, 9, 9]; array.indexOf(2 // 0 array.indexOf(7 // -1 array.indexOf(9, 2 // 2 array.indexOf(2, -1 // -1 array.indexOf(2, -3 // 0

找出指定元素出现的所有位置

var indices = []; var array = ['a', 'b', 'a', 'c', 'a', 'd']; var element = 'a'; var idx = array.indexOf(element while (idx != -1) { indices.push(idx idx = array.indexOf(element, idx + 1 } console.log(indices // [0, 2, 4]

判断一个元素是否在数组里,不在则更新数组

function updateVegetablesCollection (veggies, veggie) { if (veggies.indexOf(veggie) === -1) { veggies.push(veggie console.log('New veggies collection is : ' + veggies } else if (veggies.indexOf(veggie) > -1) { console.log(veggie + ' already exists in the veggies collection.' } } var veggies = ['potato', 'tomato', 'chillies', 'green-pepper']; updateVegetablesCollection(veggies, 'spinach' // New veggies collection is : potato,tomato,chillies,green-pepper,spinach updateVegetablesCollection(veggies, 'spinach' // spinach already exists in the veggies collection.

Polyfill

indexOf()在ECMA-262 标准 的第5版中被加入,但并非所有的浏览器都支持该方法。你可以在编写scripts时,在其开头使用以下代码,它能够允许你在没有本地支持的情况下使用indexOf()方法。该算法符合ECMA-262第5版其中一项规定, 即假定TypeErrorMath.abs()呈现它们原有的价值。

if (!Array.prototype.indexOf) Array.prototype.indexOf = function(searchValue, index) {   // In non-strict-mode, if the `this` variable is null   // or undefined, then it is set the the window object.   // Else, `this` is automaticly converted to an object. var len = this.length >>> 0; // convert ot number or 0   index |= 0; // rounds and NaN-checks   if (index < 0) // check if negative start   index = Math.max(len - index, 0 else if (index >= len) // else, check if too big return -1;     if (searchValue === undefined)       // Because searchValue is undefined, keys that       // don't exist will have the same value as the       // searchValue, and thus do need to be checked.       do {         if (index in this && this[index] === undefined)           return index;       } while (++index !== len) else       // Because searchValue is not undefined, there's no       // need to check if the current key is in the array       // because if the key isn't in the array, then it's       // undefined which is not equal to the searchValue.       do {         if (this[index] === searchValue)           return index;       } while (++index !== len)     // if nothing was found, then simply return -1 return -1; };

但是,如果您对ECMA标准定义的所有小技术更感兴趣,并且不太关注性能或简洁性,那么您可能会发现这种更具描述性的polyfill更有用。

// Production steps of ECMA-262, Edition 5, 15.4.4.14 // Reference: http://es5.github.io/#x15.4.4.14 if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(searchElement, fromIndex) { var k; // 1. Let o be the result of calling ToObject passing // the this value as the argument. if (this == null) { throw new TypeError('"this" is null or not defined' } var o = Object(this // 2. Let lenValue be the result of calling the Get // internal method of o with the argument "length". // 3. Let len be ToUint32(lenValue). var len = o.length >>> 0; // 4. If len is 0, return -1. if (len === 0) { return -1; } // 5. If argument fromIndex was passed let n be // ToInteger(fromIndex else let n be 0. var n = fromIndex | 0; // 6. If n >= len, return -1. if (n >= len) { return -1; } // 7. If n >= 0, then Let k be n. // 8. Else, n<0, Let k be len - abs(n). // If k is less than 0, then let k be 0. k = Math.max(n >= 0 ? n : len - Math.abs(n), 0 // 9. Repeat, while k < len while (k < len) { // a. Let Pk be ToString(k). // This is implicit for LHS operands of the in operator // b. Let kPresent be the result of calling the // HasProperty internal method of o with argument Pk. // This step can be combined with c // c. If kPresent is true, then // i. Let elementK be the result of calling the Get // internal method of o with the argument ToString(k). // ii. Let same be the result of applying the // Strict Equality Comparison Algorithm to // searchElement and elementK. // iii. If same is true, return k. if (k in o && o[k] === searchElement) { return k; } k++; } return -1; }; }

规范

SpecificationStatusComment
ECMAScript 5.1 (ECMA-262)The definition of 'Array.prototype.indexOf' in that specification.StandardInitial definition. Implemented in JavaScript 1.6.
ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'Array.prototype.indexOf' in that specification.Standard
ECMAScript Latest Draft (ECMA-262)The definition of 'Array.prototype.indexOf' in that specification.Living Standard

浏览器兼容性

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic Support(Yes)(Yes)1.59(Yes)(Yes)

FeatureAndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
Basic Support(Yes)(Yes)(Yes)1(Yes)(Yes)(Yes)