Показать сообщение отдельно
  #33 (permalink)  
Старый 22.11.2014, 00:07
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от krutoy
Скорей, в кривости реализации.
не в кривости а в требованиях, оригинальная реализация выглядит примерно так:
Array.prototype.foreach = function (callback, thisArg) {

  var T, k;

  if (this == null) {
    throw new TypeError(' this is null or not defined');
  }

  // 1. Положим O равным результату вызова ToObject passing the |this| value as the argument.
  var O = Object(this);

  // 2. Положим lenValue равным результату вызова внутреннего метода Get объекта O с аргументом "length".
  // 3. Положим len равным ToUint32(lenValue).
  var len = O.length >>> 0;

  // 4. Если IsCallable(callback) равен false, выкинем исключение TypeError.
  // Смотрите: [url]http://es5.github.com/#x9.11[/url]
  if (typeof callback !== 'function') {
    throw new TypeError(callback + ' is not a function');
  }

  // 5. Если thisArg присутствует, положим T равным thisArg; иначе положим T равным undefined.
  if (arguments.length > 1) {
    T = thisArg;
  }

  // 6. Положим k равным 0
  k = 0;

  // 7. Пока k < len, будем повторять
  while (k < len) {

    var kValue;

    // a. Положим Pk равным ToString(k).
    //   Это неявное преобразование для левостороннего операнда в операторе in
    // b. Положим kPresent равным результату вызова внутреннего метода HasProperty объекта O с аргументом Pk.
    //   Этот шаг может быть объединён с шагом c
    // c. Если kPresent равен true, то
    if (k in O) {

      // i. Положим kValue равным результату вызова внутреннего метода Get объекта O с аргументом Pk.
      kValue = O[k];

      // ii. Вызовем внутренний метод Call функции callback с объектом T в качестве значения this и
      // списком аргументов, содержащим kValue, k и O.
      callback.call(T, kValue, k, O);
    }
    // d. Увеличим k на 1.
    k++;
  }
  // 8. Вернём undefined.
};
 
arr=[]
i=10000
while(i--){arr.push(i)}
 
tst=function(x){return x + 1}
console.time("forEach")
arr.forEach(tst)
console.timeEnd("forEach")
console.time("foreach")
arr.foreach(tst)
console.timeEnd("foreach")

//  Chrome: 
//    forEach: 1.000ms
//    foreach: 1.000ms
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием