crypto-pro-js/example/polyfills/map.js

91 lines
4.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Шаги алгоритма ECMA-262, 5-е издание, 15.4.4.19
// Ссылка (en): http://es5.github.com/#x15.4.4.19
// Ссылка (ru): http://es5.javascript.ru/x15.4.html#x15.4.4.19
if (!Array.prototype.map) {
Array.prototype.map = function(callback, thisArg) {
var T, A, k;
if (this == null) {
throw new TypeError(' this is null or not defined');
}
// 1. Положим O равным результату вызова ToObject с передачей ему
// значения |this| в качестве аргумента.
var O = Object(this);
// 2. Положим lenValue равным результату вызова внутреннего метода Get
// объекта O с аргументом "length".
// 3. Положим len равным ToUint32(lenValue).
var len = O.length >>> 0;
// 4. Если вызов IsCallable(callback) равен false, выкидываем исключение TypeError.
// Смотрите (en): http://es5.github.com/#x9.11
// Смотрите (ru): http://es5.javascript.ru/x9.html#x9.11
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. Положим A равным новому масиву, как если бы он был создан выражением new Array(len),
// где Array является стандартным встроенным конструктором с этим именем,
// а len является значением len.
A = new Array(len);
// 7. Положим k равным 0
k = 0;
// 8. Пока k < len, будем повторять
while (k < len) {
var kValue, mappedValue;
// 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. Положим mappedValue равным результату вызова внутреннего метода Call
// функции callback со значением T в качестве значения this и списком
// аргументов, содержащим kValue, k и O.
mappedValue = callback.call(T, kValue, k, O);
// iii. Вызовем внутренний метод DefineOwnProperty объекта A с аргументами
// Pk, Описатель Свойства
// { Value: mappedValue,
// Writable: true,
// Enumerable: true,
// Configurable: true }
// и false.
// В браузерах, поддерживающих Object.defineProperty, используем следующий код:
// Object.defineProperty(A, k, {
// value: mappedValue,
// writable: true,
// enumerable: true,
// configurable: true
// });
// Для лучшей поддержки браузерами, используем следующий код:
A[k] = mappedValue;
}
// d. Увеличим k на 1.
k++;
}
// 9. Вернём A.
return A;
};
}