code: function eachProp(callback, thisArg = UNDEFINED, defaultResult = UNDEFINED) {
      const arg = this;
      let result = defaultResult;
  
      if (isObjectLike(arg) && (arg.constructor === Object || arg.constructor === Array)) {
          const keys = Object.keys(arg);
          let i = keys.length;
          const savedReturned = BREAK.clearDefault(defaultResult);
          while (i--) {
              const key = keys[i];
              if (callback.call(thisArg, arg[key], toArrayIndex(key), arg) === BREAK) {
                  result = BREAK.returned;
                  break;
              }
          }
          BREAK.restoreDefault(savedReturned);
      }
      return result;
  }
docs: invoke callback for each own property of arg (object/array)
  order of keys used for callback invocation is not specified
  
  @this       {*}
  @param callback {function}  function(value, key, arg), key is number if arrayIndex, else
  string callback can return BREAK to break out of loop and have undefined returned, or
  return BREAK(arg) to break out of loop and have eachProp return arg as result
  @param thisArg  what to use as this for the function call, or undefined
  @param defaultResult {*} default result value if none is returned from callback using BREAK
  @return {*}