getObjectCloneStrict = (object, realm, handleCopy, cache) => {
    const clone = getCleanClone(object, realm);
    const properties = SUPPORTS.SYMBOL_PROPERTIES ? [].concat(getOwnPropertyNames(object), getOwnPropertySymbols(object)) : getOwnPropertyNames(object);

    if (properties.length) {
      for (let index = 0, property, descriptor; index < properties.length; index++) {
        property = properties[index];

        if (property !== 'callee' && property !== 'caller') {
          descriptor = getOwnPropertyDescriptor(object, property);
          descriptor.value = handleCopy(object[property], cache);
          defineProperty(clone, property, descriptor);
        }
      }
    }

    return clone;
  }
@function getObjectCloneStrict

@description
get a copy of the object based on strict rules, meaning all keys and symbols
are copied based on the original property descriptors

@param object the object to clone
@param realm the realm the object resides in
@param handleCopy the function that handles copying the object
@returns the copied object