# 描述

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

# 参数

参数 描述
searchElement 要查找的元素
fromIndex 可选。开始查找的位置,如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回 -1 。如果参数提供的是一个负值,则将其作为数组末尾的一个抵消,即 -1 表示从最后一个元素开始查找, -2 表示从倒数第二个元素开始查找,以此类推(查找顺序不变,仍然是从前向后查询数组)。如果抵消后的索引值仍小于 0 ,则整个数组都会被查询。默认值为 0 。

# 返回值

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

# 示例

# 返回首个被查找到的元素的索引

var arr = ["a", "b", "c", "a"];

var indexB = arr.indexOf("b");

var indexD = arr.indexOf("d");

console.log(indexB); //  1
console.log(indexD); //  -1

# 严格相等

var arr = [1, 2, 3];

var indexStr = arr.indexOf("2");
var indexNum = arr.indexOf(2);

console.log(indexStr); //  -1
console.log(indexNum); //  1

# 使用 fromeIndex 参数

var arr = ["a", "b", "c", "b", "a"];

var indexB1 = arr.indexOf("b");
var indexB2 = arr.indexOf("b", 2);

console.log(indexB1); //  1
console.log(indexB2); //  3

# fromIndex 大于或等于数组长度,返回 -1

var arr = ["a", "b", "c"];

var index = arr.indexOf("a", 5);

console.log(index); // -1

# fromIndex 为负值

var arr = ["a", "b", "c"];

// -1 表示从倒数第一个元素开始查找
var index = arr.indexOf("a", -1);

console.log(index); // -1

# 模拟实现

Array.prototype.indexOf = function(searchElement, fromIndex) {
  var se = searchElement;
  var fi = parseInt(fromIndex) || 0;
  var arr = this;
  var len = arr.length;
  var i = 0;

  if (fi >= len) return -1;

  if (fi < 0) {
    i = len + fi;
  }

  for (; i < arr.length; i++) {
    if (arr[i] === se) {
      return i;
    }
  }
  return -1;
};

# 拓展

indexOf 只能得到查找元素在数组中首次出现位置的索引,那如果我想要得到该元素在数组中所有出现位置的索引呢?

下面是实现方法:

/*
 *  返回查找元素在数组中所有的索引组成的数组,如果数组中不存在此元素,返回空数组。
 */
Array.prototype.allIndexOf = function(searchElement) {
  var arr = this;
  var se = searchElement;
  var arrIndex = [];
  var index = 0;

  for (var i = 0; i < arr.length; i++) {
    index = arr.indexOf(se, i);
    if (index === -1) {
      return [];
    }
    arrIndex.push(index);
    i = index;
  }
  return arrIndex;
};
  • 测试
var arr = [1, 2, 3, 2, 1];

console.log(arr.allIndexOf(1)); //  [0, 4]
console.log(arr.allIndexOf(9)); //  []
// 嗯,确认过眼神,是我想要的!
上次更新: 8/9/2021, 11:31:12 AM