code: function forEach(obj, iterator, context) {
    var key;
    if (obj) {
      if (isFunction(obj)){
        for (key in obj) {
          if (key != 'prototype' && key != 'length' && key != 'name' && obj.hasOwnProperty(key)) {
            iterator.call(context, obj[key], key);
          }
        }
      } else if (obj.forEach && obj.forEach !== forEach) {
        obj.forEach(iterator, context);
      } else if (isObject(obj) && isNumber(obj.length)) {
        for (key = 0; key < obj.length; key++)
          iterator.call(context, obj[key], key);
      } else {
        for (key in obj) {
          if (obj.hasOwnProperty(key)) {
            iterator.call(context, obj[key], key);
          }
        }
      }
    }
    return obj;
  }
docs: @ngdoc function
  @name angular.forEach
  @function
  
  @description
  Invokes the `iterator` function once for each item in `obj` collection, which can be either an
  object or an array. The `iterator` function is invoked with `iterator(value, key)`, where `value`
  is the value of an object property or an array element and `key` is the object property key or
  array element index. Specifying a `context` for the function is optional.
  
  Note: this function was previously known as `angular.foreach`.
  
  <pre>
  var values = {name: 'misko', gender: 'male'};
  var log = [];
  angular.forEach(values, function(value, key){
  this.push(key + ': ' + value);
  }, log);
  expect(log).toEqual(['name: misko', 'gender:male']);
  </pre>
  
  @param {Object|Array} obj Object to iterate over.
  @param {Function} iterator Iterator function.
  @param {Object=} context Object to become context (`this`) for the iterator function.
  @returns {Object|Array} Reference to `obj`.