功能: 返回第一个满足条件的元素下标。
实现注意:
1. 没有条件满足返回-11. 数组长度为0 返回 -11. 符合条件就停止遍历1. 稀疏数组正常遍历1. findIndex 在第一次调用回调函数的时候确认了数组的长度
// Array.prototype.findIndex ES2015 ES6var arr = [1, 2, 3, 4, 5];// 1.返回第一个满足条件元素的索引。var idx = arr.findIndex(function (item,idx,arr) {return item > 2;})console.log(item);// 2// 2.如果没有一个元素满足条件 返回-1;// 3.数组长度为0 返回的也是 -1var idx = arr.findIndex(function (item,idx,arr) {return item > 20;})console.log(idx) // -1// 4.1 稀疏数组是正常遍历空隙// 4.2 空隙将会被填充为undefined// 4.3 findIndex 如果返回true,就会停止遍历。var arr1 = [1,,3,,5,,7,,9];arr1.findIndex(function (item, idx, arr) {console.log(item);// 空隙被填充为undefinedreturn item === 5;})// 3.参数// 参数1 回调函数 cb(item,idx,arr);// item-> 当前项, idx-> 数组的索引 arr->数组本身// 回调函数内部是无法改变数组元素的值.// 回调函数返回值 bool 返回 true 停止遍历// 参数2 更改findIndex 函数内部 this指向;// 默认情况下 this -> window// 严格模式下 this === undefinedvar idx = arr.findIndex(function (item,idx,arr) {})// 6. 回调函数中虽然数组增加了元素,但是函数只会遍历最初数组的长度// findIndex 在第一次调用回调函数的时候确认了数组的长度var idx = arr.findIndex(function (item,idx,arr) {if(idx === 0){arr.splice(1,1);// 最后走的一次。 补undefined。实际数组对应下标被删除delete arr[1];// 删除元素对应下标的值 并补undefined 实际数组对应下标变成emptyarr.pop(); // 删除元素下标对应的值。补undefined 实际数组被删除最后一个}})// demo1var idx = [1,2,3,4,5].findIndex(function(item,id,arr){if(id === 0){arr.splice(1,1);arr.push(6);}console.log(item); // push 6 的情况下 1, 3, 4, 5, 6;// 不push6的情况下 1, 3, 4, 5, undefined})// findIndex polyfillArray.prototype.myFindIndex = function (cb) {if(this === null){throw new TypeError ('this is not allowed to be null');}if(typeof cb !== 'function'){throw new TypeError (cb +' is not a function')}var obj = Object(this),len = obj.length >>>0,step = 0,arg2 = arguments[1],item;while (step < len){item = obj[step];if(cb.apply(arg2,[item, step, obj])){return step;}step ++; // 步数加加}return -1;}
