function ArrayFrom(arrayLike, mapfn, receiver) {
  var items = TO_OBJECT(arrayLike);
  var mapping = !IS_UNDEFINED(mapfn);

  if (mapping) {
    if (!IS_CALLABLE(mapfn)) {
      throw MakeTypeError(kCalledNonCallable, mapfn);
    }
  }

  var iterable = GetMethod(items, iteratorSymbol);
  var k;
  var result;
  var mappedValue;
  var nextValue;

  if (!IS_UNDEFINED(iterable)) {
    result = %IsConstructor(this) ? new this() : [];
    k = 0;

    for (nextValue of
         { [iteratorSymbol]() { return GetIterator(items, iterable) } }) {
      if (mapping) {
        mappedValue = %_Call(mapfn, receiver, nextValue, k);
      } else {
        mappedValue = nextValue;
      }
      %CreateDataProperty(result, k, mappedValue);
      k++;
    }
    result.length = k;
    return result;
  } else {
    var len = TO_LENGTH(items.length);
    result = %IsConstructor(this) ? new this(len) : new GlobalArray(len);

    for (k = 0; k < len; ++k) {
      nextValue = items[k];
      if (mapping) {
        mappedValue = %_Call(mapfn, receiver, nextValue, k);
      } else {
        mappedValue = nextValue;
      }
      %CreateDataProperty(result, k, mappedValue);
    }

    result.length = k;
    return result;
  }
}
function ArrayFrom(arrayLike, mapfn, receiver) {
  var items = TO_OBJECT(arrayLike);
  var mapping = !IS_UNDEFINED(mapfn);

  if (mapping) {
    if (!IS_CALLABLE(mapfn)) {
      throw MakeTypeError(kCalledNonCallable, mapfn);
    }
  }

  var iterable = GetMethod(items, iteratorSymbol);
  var k;
  var result;
  var mappedValue;
  var nextValue;

  if (!IS_UNDEFINED(iterable)) {
    result = %IsConstructor(this) ? new this() : [];
    k = 0;

    for (nextValue of
         { [iteratorSymbol]() { return GetIterator(items, iterable) } }) {
      if (mapping) {
        mappedValue = %_Call(mapfn, receiver, nextValue, k);
      } else {
        mappedValue = nextValue;
      }
      %CreateDataProperty(result, k, mappedValue);
      k++;
    }
    result.length = k;
    return result;
  } else {
    var len = TO_LENGTH(items.length);
    result = %IsConstructor(this) ? new this(len) : new GlobalArray(len);

    for (k = 0; k < len; ++k) {
      nextValue = items[k];
      if (mapping) {
        mappedValue = %_Call(mapfn, receiver, nextValue, k);
      } else {
        mappedValue = nextValue;
      }
      %CreateDataProperty(result, k, mappedValue);
    }

    result.length = k;
    return result;
  }
}
function ArrayFrom ( arrayLike , mapfn , receiver ) { var items = TO_OBJECT ( arrayLike ) ; var mapping = ! IS_UNDEFINED ( mapfn ) ; if ( mapping ) { if ( ! IS_CALLABLE ( mapfn ) ) { throw MakeTypeError ( kCalledNonCallable , mapfn ) ; } } var iterable = GetMethod ( items , iteratorSymbol ) ; var k ; var result ; var mappedValue ; var nextValue ; if ( ! IS_UNDEFINED ( iterable ) ) { result = % IsConstructor ( this ) ? new this ( ) : [ ] ; k = 0 ; for ( nextValue of { [ iteratorSymbol ] ( ) { return GetIterator ( items , iterable ) } } ) { if ( mapping ) { mappedValue = % _Call ( mapfn , receiver , nextValue , k ) ; } else { mappedValue = nextValue ; } % CreateDataProperty ( result , k , mappedValue ) ; k ++ ; } result . length = k ; return result ; } else { var len = TO_LENGTH ( items . length ) ; result = % IsConstructor ( this ) ? new this ( len ) : new GlobalArray ( len ) ; for ( k = 0 ; k < len ; ++ k ) { nextValue = items [ k ] ; if ( mapping ) { mappedValue = % _Call ( mapfn , receiver , nextValue , k ) ; } else { mappedValue = nextValue ; } % CreateDataProperty ( result , k , mappedValue ) ; } result . length = k ; return result ; } }
ES6, draft 10-14-14, section 22.1.2.1
ES6 draft 10 - 14 - 14 section 22 . 1 . 2 . 1