Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...
Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
Топ:
Оснащения врачебно-сестринской бригады.
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов...
Процедура выполнения команд. Рабочий цикл процессора: Функционирование процессора в основном состоит из повторяющихся рабочих циклов, каждый из которых соответствует...
Интересное:
Берегоукрепление оползневых склонов: На прибрежных склонах основной причиной развития оползневых процессов является подмыв водами рек естественных склонов...
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Дисциплины:
2017-06-29 | 390 |
5.00
из
|
Заказать работу |
|
|
Каррирование - это приём в функциональном программировании, позволяющий преобразовать функцию, заменив её несколько первых аргументов константными значениями, тем самым создав новую функцию с меньшим количеством аргументов на основе старой. Этот будет удобно применять в случае, когда первые несколько аргументов функции заранее известны, и указывать их при каждом вызове нет необходимости.
function sum(a, b) {
return a + b;
}
function sayTwoWords(word1, word2) {
console.log(word1 + " " + word2);
}
function curry(func, a) {
return function (b) {
return func(a, b);
};
}
var sayGoodbyeTo = curry(sayTwoWords, "Goodbye");
sayGoodbyeTo("Mary"); // "Goodbye Mary"
var minusThree = curry(sum, -3);
console.log(minusThree(13)); // 10
В JS функция при вызове может принимать произвольное количество аргументов, вне зависимости от того, сколько их было указанно при объявлении. Пользуясь этой возможностью, объявим куррирующую функцию с одним параметром func, в который будет передаваться каррируемая функция. Остальные же параметры будут значениями, на которые будут заменяться первые аргументы каррируемой функции. Эти значения мы будем извлекать из объекта arguments, в котором содержатся все значения аргументов функции, и записывать в массив. В возвращаемой функции нам необходимо вызвать каррируемую функцию, подставив в качестве первых аргументов значения из массива curryArgs, а в качестве остальных — значения, переданные в качестве параметров возвращаемой функции. Для этого воспользуемся методом apply, который позволяет вызвать функцию со значениями аргументов, которые переданы ему в массиве. Перед тем, как вызвать метод apply от каррируемой функции, преобразуем в массив объект arguments возвращаемой функции и склеим, при помощи метода concat, массив curryArgs c полученным массивом. Результат этой операции и передадим в качестве второго аргумента методу apply. В итоге функция curry примет вид:
|
function curry(func) {
var args = arguments, curryArgs = [];
for (var i = 1; i < args.length; i++) {
curryArgs[i - 1] = args[i];
}
return function () {
var argsArr = Array.prototype.slice.call(arguments, 0);
curryArgs = curryArgs.concat(argsArr);
return func.apply(this, curryArgs);
}
}
В ES2015 функцию каррирования можно записать короче:
function curry(func,...curryArgs)
{
return (...rest) =>
func(...curryArgs,...rest);
}
Примеры:
function multiply(x, y)
{
return x * y;
}
const double = curry(multiply, 2);
double(2); // 4
const double4 = (x) => multiply(x, 2);
const double3 = (y) => multiply(2, y);
Иногда наши рекурсивные или часто вызываемые функции очень сильно «тормозят» выполнение программы, потому что результаты промежуточных вычислений нигде не сохраняются, а вычисляются заново. Мемоизация — сохранение результатов выполнения функций для предотвращения повторных вычислений. Перед вызовом функции проверяется, вызывалась ли функция ранее: если не вызывалась, функция вызывается и результат её выполнения сохраняется; если вызывалась, используется сохранённый результат. Классическим примером для иллюстрации является функция, вычисляющая последовательность чисел Фибоначчи:
function fibonacci(n) {
if (n === 0 || n === 1)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
Для больших чисел n количество вызовов функции растёт очень быстро. Уже для n=50 это порядка 40 миллиардов вызовов. Используя идею мемоизации, то есть кеширования промежуточного результата, можно добиться уменьшения количества вызовов для n=50 до всего лишь 99:
var fibonacci = (function() {
var memo = {};
function f(n) {
var value;
if (n in memo) {
value = memo[n];
}
else {
if (n === 0 || n === 1)
value = n;
else
value = f(n - 1) + f(n - 2);
memo[n] = value;
}
return value;
}
return f;
})();
Работа с объектом типа Date.
Для работы с датой и временем в JavaScript используются объекты Date.
Создание
Для создания нового объекта типа Date используется один из синтаксисов:
new Date()
Создает объект Date с текущей датой и временем:
var now = new Date();
new Date(milliseconds)
Создает объект Date, значение которого равно количеству миллисекунд (1/1000 секунды), прошедших с 1 января 1970 года GMT+0.
|
var Jan02_1970 = new Date(3600 * 24 * 1000);
new Date(datestring)
Если единственный аргумент – строка, используется вызов Date.parse для чтения даты из неё. Метод Date.parse(str) разбирает строку str в формате YYYY-MM-DDTHH:mm:ss.sssZ и возвращает соответствующее ей количество миллисекунд. Если это невозможно, Date.parse возвращает NaN. Например:
var msUTC = Date.parse('2012-01-26T13:51:50.417Z'); // зона UTC
alert(msUTC); // 1327571510417 (число миллисекунд)
С таймзоной -07:00 GMT:
var ms = Date.parse('2012-01-26T13:51:50.417-07:00');
alert(ms); // 1327611110417 (число миллисекунд)
new Date(year, month, date, hours, minutes, seconds, ms)
Дату можно создать, используя компоненты в местной временной зоне. Для этого формата обязательны только первые два аргумента. Отсутствующие параметры, начиная с hours считаются равными нулю, а date – единице. Год year должен быть из 4 цифр. Отсчет месяцев month начинается с нуля 0.
new Date(2011, 0, 1); // 1 января 2011, 00:00:00
Получение компонентов даты
getFullYear() - получить год (из 4 цифр)
getMonth() - получить месяц, от 0 до 11.
getDate() - получить число месяца, от 1 до 31.
getHours(), getMinutes(), getSeconds(), getMilliseconds() - получить соответствующие компоненты.
getDay() - получить номер дня в неделе. Неделя в JavaScript начинается с воскресенья, так что результат будет числом от 0(воскресенье) до 6(суббота).
Все методы, указанные выше, возвращают результат для местной временной зоны. Существуют также UTC-варианты этих методов, возвращающие день, месяц, год и т.п. для зоны GMT+0 (UTC): getUTCFullYear(), getUTCMonth(), getUTCDay().
Кроме описанных выше, существуют два специальных метода без UTC-варианта:
getTime() - возвращает число миллисекунд, прошедших с 1 января 1970 года GMT+0.
getTimezoneOffset() - возвращает разницу между местным и UTC-временем, в минутах.
Установка компонентов даты
Следующие методы позволяют устанавливать компоненты даты и времени:
ü setFullYear(year[, month, date])
ü setMonth(month[, date])
ü setDate(date)
ü setHours(hour[, min, sec, ms])
ü setMinutes(min[, sec, ms])
ü setSeconds(sec[, ms])
ü setMilliseconds(ms)
ü setTime(milliseconds) (устанавливает всю дату по миллисекундам с 01.01.1970 UTC)
Все они, кроме setTime(), обладают также UTC-вариантом, например: setUTCHours().
Автоисправление даты
Автоисправление – очень удобное свойство объектов Date. Оно заключается в том, что можно устанавливать заведомо некорректные компоненты (например 32 января), а объект сам себя поправит.
var d = new Date(2013, 0, 32); // 32 января 2013?!?
alert(d); // это 1 февраля 2013!
|
|
Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!