功能: 返回第一个满足条件的元素下标。
    实现注意:

    1. 1. 没有条件满足返回-1
    2. 1. 数组长度为0 返回 -1
    3. 1. 符合条件就停止遍历
    4. 1. 稀疏数组正常遍历
    5. 1. findIndex 在第一次调用回调函数的时候确认了数组的长度
    1. // Array.prototype.findIndex ES2015 ES6
    2. var arr = [1, 2, 3, 4, 5];
    3. // 1.返回第一个满足条件元素的索引。
    4. var idx = arr.findIndex(function (item,idx,arr) {
    5. return item > 2;
    6. })
    7. console.log(item);// 2
    8. // 2.如果没有一个元素满足条件 返回-1;
    9. // 3.数组长度为0 返回的也是 -1
    10. var idx = arr.findIndex(function (item,idx,arr) {
    11. return item > 20;
    12. })
    13. console.log(idx) // -1
    14. // 4.1 稀疏数组是正常遍历空隙
    15. // 4.2 空隙将会被填充为undefined
    16. // 4.3 findIndex 如果返回true,就会停止遍历。
    17. var arr1 = [1,,3,,5,,7,,9];
    18. arr1.findIndex(function (item, idx, arr) {
    19. console.log(item);// 空隙被填充为undefined
    20. return item === 5;
    21. })
    22. // 3.参数
    23. // 参数1 回调函数 cb(item,idx,arr);
    24. // item-> 当前项, idx-> 数组的索引 arr->数组本身
    25. // 回调函数内部是无法改变数组元素的值.
    26. // 回调函数返回值 bool 返回 true 停止遍历
    27. // 参数2 更改findIndex 函数内部 this指向;
    28. // 默认情况下 this -> window
    29. // 严格模式下 this === undefined
    30. var idx = arr.findIndex(function (item,idx,arr) {
    31. })
    32. // 6. 回调函数中虽然数组增加了元素,但是函数只会遍历最初数组的长度
    33. // findIndex 在第一次调用回调函数的时候确认了数组的长度
    34. var idx = arr.findIndex(function (item,idx,arr) {
    35. if(idx === 0){
    36. arr.splice(1,1);// 最后走的一次。 补undefined。实际数组对应下标被删除
    37. delete arr[1];// 删除元素对应下标的值 并补undefined 实际数组对应下标变成empty
    38. arr.pop(); // 删除元素下标对应的值。补undefined 实际数组被删除最后一个
    39. }
    40. })
    41. // demo1
    42. var idx = [1,2,3,4,5].findIndex(function(item,id,arr){
    43. if(id === 0){
    44. arr.splice(1,1);
    45. arr.push(6);
    46. }
    47. console.log(item); // push 6 的情况下 1, 3, 4, 5, 6;
    48. // 不push6的情况下 1, 3, 4, 5, undefined
    49. })
    50. // findIndex polyfill
    51. Array.prototype.myFindIndex = function (cb) {
    52. if(this === null){
    53. throw new TypeError ('this is not allowed to be null');
    54. }
    55. if(typeof cb !== 'function'){
    56. throw new TypeError (cb +' is not a function')
    57. }
    58. var obj = Object(this),
    59. len = obj.length >>>0,
    60. step = 0,
    61. arg2 = arguments[1],
    62. item;
    63. while (step < len){
    64. item = obj[step];
    65. if(cb.apply(arg2,[item, step, obj])){
    66. return step;
    67. }
    68. step ++; // 步数加加
    69. }
    70. return -1;
    71. }