*
@method map(<map>, [scope])
@returns Array
@short Maps the array to another array containing the values that are the result of calling <map> on each element.
@extra [scope] is the %this% object. In addition to providing this method for browsers that don't support it natively, this enhanced method also directly accepts a string, which is a shortcut for a function that gets that property (or invokes a function) on each element.
@example

+   [1,2,3].map(function(n) {
return n * 3;
});                                  -> [3,6,9]
['one','two','three'].map(function(n) {
return n.length;
});                                  -> [3,3,5]
['one','two','three'].map('length')  -> [3,3,5]
*
function(fn, scope) {
      var length = this.length, index = 0, result = new Array(length);
      checkFirstArgumentExists(arguments);
      while(index < length) {
        if(index in this) {
          result[index] = fn.call(scope, this[index], index, this);
        }
        index++;
      }
      return result;
    }