docs: function deepClone(obj) {
      var hash = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new WeakMap();
  
      var cloneObj = void 0;
      var Constructor = obj.constructor;
      switch (Constructor) {
          case RegExp:
              cloneObj = new Constructor(obj);
              break;
          case Date:
              cloneObj = new Constructor(obj.getTime());
              break;
          default:
              if (hash.has(obj)) return hash.get(obj);
              cloneObj = new Constructor();
              hash.set(obj, cloneObj);
      }
      for (var key in obj) {
          cloneObj[key] = isObj(obj[key]) ? deepClone(obj[key], hash) : obj[key];
      }
      return cloneObj;
  }