function InnerArrayIndexOf(array, element, index, length) {
  if (length == 0) return -1;
  if (IS_UNDEFINED(index)) {
    index = 0;
  } else {
    index = INVERT_NEG_ZERO(TO_INTEGER(index));
    // If index is negative, index from the end of the array.
    if (index < 0) {
      index = length + index;
      // If index is still negative, search the entire array.
      if (index < 0) index = 0;
    }
  }
  var min = index;
  var max = length;
  if (UseSparseVariant(array, length, IS_ARRAY(array), max - min)) {
    %NormalizeElements(array);
    var indices = %GetArrayKeys(array, length);
    if (IS_NUMBER(indices)) {
      // It's an interval.
      max = indices;  // Capped by length already.
      // Fall through to loop below.
    } else {
      if (indices.length == 0) return -1;
      // Get all the keys in sorted order.
      var sortedKeys = GetSortedArrayKeys(array, indices);
      var n = sortedKeys.length;
      var i = 0;
      while (i < n && sortedKeys[i] < index) i++;
      while (i < n) {
        var key = sortedKeys[i];
        if (array[key] === element) return key;
        i++;
      }
      return -1;
    }
  }
  // Lookup through the array.
  if (!IS_UNDEFINED(element)) {
    for (var i = min; i < max; i++) {
      if (array[i] === element) return i;
    }
    return -1;
  }
  // Lookup through the array.
  for (var i = min; i < max; i++) {
    if (IS_UNDEFINED(array[i]) && i in array) {
      return i;
    }
  }
  return -1;
}
function InnerArrayIndexOf(array, element, index, length) {
  if (length == 0) return -1;
  if (IS_UNDEFINED(index)) {
    index = 0;
  } else {
    index = INVERT_NEG_ZERO(TO_INTEGER(index));
    
    if (index < 0) {
      index = length + index;
      
      if (index < 0) index = 0;
    }
  }
  var min = index;
  var max = length;
  if (UseSparseVariant(array, length, IS_ARRAY(array), max - min)) {
    %NormalizeElements(array);
    var indices = %GetArrayKeys(array, length);
    if (IS_NUMBER(indices)) {
      
      max = indices;  
      
    } else {
      if (indices.length == 0) return -1;
      
      var sortedKeys = GetSortedArrayKeys(array, indices);
      var n = sortedKeys.length;
      var i = 0;
      while (i < n && sortedKeys[i] < index) i++;
      while (i < n) {
        var key = sortedKeys[i];
        if (array[key] === element) return key;
        i++;
      }
      return -1;
    }
  }
  
  if (!IS_UNDEFINED(element)) {
    for (var i = min; i < max; i++) {
      if (array[i] === element) return i;
    }
    return -1;
  }
  
  for (var i = min; i < max; i++) {
    if (IS_UNDEFINED(array[i]) && i in array) {
      return i;
    }
  }
  return -1;
}
function InnerArrayIndexOf ( array , element , index , length ) { if ( length == 0 ) return - 1 ; if ( IS_UNDEFINED ( index ) ) { index = 0 ; } else { index = INVERT_NEG_ZERO ( TO_INTEGER ( index ) ) ; // If index is negative, index from the end of the array. if ( index < 0 ) { index = length + index ; // If index is still negative, search the entire array. if ( index < 0 ) index = 0 ; } } var min = index ; var max = length ; if ( UseSparseVariant ( array , length , IS_ARRAY ( array ) , max - min ) ) { % NormalizeElements ( array ) ; var indices = % GetArrayKeys ( array , length ) ; if ( IS_NUMBER ( indices ) ) { // It's an interval. max = indices ; // Capped by length already. // Fall through to loop below. } else { if ( indices . length == 0 ) return - 1 ; // Get all the keys in sorted order. var sortedKeys = GetSortedArrayKeys ( array , indices ) ; var n = sortedKeys . length ; var i = 0 ; while ( i < n && sortedKeys [ i ] < index ) i ++ ; while ( i < n ) { var key = sortedKeys [ i ] ; if ( array [ key ] === element ) return key ; i ++ ; } return - 1 ; } } // Lookup through the array. if ( ! IS_UNDEFINED ( element ) ) { for ( var i = min ; i < max ; i ++ ) { if ( array [ i ] === element ) return i ; } return - 1 ; } // Lookup through the array. for ( var i = min ; i < max ; i ++ ) { if ( IS_UNDEFINED ( array [ i ] ) && i in array ) { return i ; } } return - 1 ; }
For .indexOf, we don't need to pass in the number of arguments at the callsite since ToInteger(undefined) == 0; however, for .lastIndexOf, we need to pass it, since the behavior for passing undefined is 0 but for not including the argument is length-1.
For . indexOf we don t need to pass in the number of arguments at the callsite since ToInteger ( undefined ) == 0 ; however for . lastIndexOf we need to pass it since the behavior for passing undefined is 0 but for not including the argument is length - 1 .