code: 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;
  }
docs: 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.