code: function forIn(obj, fn, thisObj){
          var key, i = 0;
          // no need to check if argument is a real object that way we can use
          // it for arrays, functions, date, etc.
  
          //post-pone check till needed
          if (_hasDontEnumBug == null) { checkDontEnum(); }
  
          for (key in obj) {
              if (exec(fn, obj, key, thisObj) === false) {
                  break;
              }
          }
  
          if (_hasDontEnumBug) {
              while (key = _dontEnums[i++]) {
                  // since we aren't using hasOwn check we need to make sure the
                  // property was overwritten
                  if (obj[key] !== Object.prototype[key]) {
                      if (exec(fn, obj, key, thisObj) === false) {
                          break;
                      }
                  }
              }
          }
      }
docs: Similar to Array/forEach but works over object properties and fixes Don't
  Enum bug on IE.
  based on: http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation