code: function forEach(collection, callback, thisArg) {
        var length = collection ? collection.length : 0;
        callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3);
  
        return (typeof length == 'number' && length > -1 && length <= maxSafeInteger)
          ? arrayEach(collection, callback)
          : baseEach(collection, callback);
      }
docs: Iterates over elements of a collection executing the callback for each
  element. The callback is bound to `thisArg` and invoked with three arguments;
  (value, index|key, collection). Callbacks may exit iteration early by
  explicitly returning `false`.
  
  Note: As with other "Collections" methods, objects with a `length` property
  are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
  may be used for object iteration.
  
  @static
  @memberOf _
  @alias each
  @category Collections
  @param {Array|Object|string} collection The collection to iterate over.
  @param {Function} [callback=identity] The function called per iteration.
  @param {*} [thisArg] The `this` binding of `callback`.
  @returns {Array|Object|string} Returns `collection`.
  @example
  
  _([1, 2, 3]).forEach(function(num) { console.log(num); }).join(',');
  // => logs each number and returns '1,2,3'
  
  _.forEach({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { console.log(num); });
  // => logs each number and returns the object (property order is not guaranteed across environments)