JS findIndex()

🌙
手机阅读
本文目录结构

如果某个元素满足所提供的测试函数,**findIndex()**方法返回类型化数组中的 下标。否则返回 -1。 TypedArray 是这里的 类型化数组类型 之一。

同时请参见find()方法,它返回了类型化数组中所发现元素的 ,而不是它的下标。

语法

typedarray.findIndex(callback[, thisArg])

参数

callback

用于在类型化数组中的每个元素上执行的函数,接受三个参数:

element

要处理的类型化数组的当前元素。

index

要处理的当前元素在类型化数组中的下标

array

find 在其上调用的类型化数组

thisArg

可选,执行callback时的this值。

返回值

如果元素通过了测试,则为数组下标,否则为 -1。

描述

findIndex 方法对类型化数组中的每个元素执行一次 callback 函数,直到它找到一个使 callback 返回 _true_的元素。如果发现了一个这样的元素,find 方法将会立即返回该元素的下标。否则,findIndex 方法会返回 -1。callback 只会对那些已经被赋值的索引调用。不会对那些被删除或从来没被赋值的索引调用。

callback 以三个参数调用:元素的值,元素索引,以及要遍历的数组对象。

如果将thisArg参数提供给findIndex,它会在调用时传递给callback,作为它的 this值。如果没有提供,会使用undefined

findIndex 不修改在其上调用的类型化数组。

findIndex处理的元素范围在callback调用之前就确定了。 在 findIndex调用之后添加到数组的元素不会由 callback访问。 如果类型化数组的现有元素被改变,或被删除,它们传给callback的值是findIndex 访问它们时候的值。已删除的元素不会被访问。

示例

在类型化数组中寻找质数的下标

下面的示例在类型化数组中寻找质数元素的下标(如果没有质数则返回 -1).

function isPrime(element, index, array) {
  var start = 2;
  while (start <= Math.sqrt(element)) {
    if (element % start++ < 1) {
      return false;
    }
  }
  return element > 1;
}

var uint8 = new Uint8Array([4, 6, 8, 12]);
var uint16 = new Uint16Array([4, 6, 7, 12]);

console.log(uint8.findIndex(isPrime)); // -1, 未发现
console.log(uint16.findIndex(isPrime)); // 2

Polyfill

TypedArray.prototype.findIndex = Array.prototype.findIndex = Array.prototype.findIndex || function(evaluator, thisArg) {
        'use strict';
        if (!this) {
          throw new TypeError('Array.prototype.some called on null or undefined');
        }
    
        if (typeof(evaluator) !== 'function') {
            if (typeof(evaluator) === 'string') {
                // 尝试将其转换为函数
                if ( ! (evaluator = eval(evaluator)) ){
                    throw new TypeError();
                }
            } else {
                throw new TypeError();
            }
        }
        
        var i;
        if (thisArg === undefined) {  // 为 thisArg 优化
            for (i in this) {
                if (evaluator(this[i], i, this)) {
                    return i;
                }
            }
            return -1;
        }
        for (i in this) {
            if (evaluator.call(thisArg, this[i], i, this)) {
                return i;
            }
        }
        return -1;
};

规范

Specification Status Comment
[ECMAScript 2015 (6th Edition, ECMA-262)
%TypedArray%.prototype.findIndex](https://www.ecma-international.org/ecma-262/6.0/#sec-%typedarray%.prototype.findindex) Standard 初始定义。
[ECMAScript Latest Draft (ECMA-262)
%TypedArray%.prototype.findIndex](https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.findindex) Draft  

浏览器兼容性

We’re converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven’t yet converted the data it contains.

  • Desktop
  • Mobile
Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 未实现 37.0 (37.0) 未实现 未实现 未实现
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support 未实现 未实现 37.0 (37.0) 未实现 未实现 未实现

另见

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了