58 лик без


Для чего используется AST - для промежуточного представления данных при парсинге

 

Rest - ...  можно только в конце применить . из interableObject делает 

Spread - Если во время применения растягивания, повторяются ключи, то в результирующий объект записывается самое правое значение:

Деструктурирующее присваивание  позволяет извлекать данные из массивов или объектов при помощи синтаксиса, подобного объявлению массива или литералов в объекте.

({a, b} = {a:1, b:2});
console.log(a); // 1
console.log(b); // 2
//Мемоизация Сохранение результатов выполнения функций для предотвращения повторных вычислений.
const Memo = () => {
  let memo = {};
  const f = (num) => {
    if (!memo[num]) {
      memo[num] = factorial(num);
    }
    return memo[num];
  }
  return f;
};
const f = Memo();
f(3); // => 6
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms))
const map = new Map()
map.set('key', 'value');
map.get('key'); // value
map.has('key'); // true
# Map поддерживает fluent интерфейс. Функция set возвращает сам Map. Таким образом можно строить цепочки:
const map = new Map();
map.set('key', 'value').set('anotherKey', 'anotherValue');
Порядок перебора
Обратите внимание, что при итерировании Map-объектов происходит перебор свойств в порядке их добавления. Что не может гарантировать обычный объект типа object.

К последнему утверждению следует добавить, что, как правило, существуют сторонние библиотеки, позволяющие не "изобретая велосипед" пользоваться множеством готовых функций "на все случаи жизни". Одной из наиболее актуальных на текущей момент javascript-библиотек является lodash, в которой реализованы различные функции по работе с массивами, коллекциями, строками и другими объектами языка. часто используюмую на практике функцию flatten, которая содержимое вложенных элементов-массивов исходного массива  

Fluent Interface - Способ реализации объектно-ориентированного АР! нацеленный на повышение читабельности исходного кода программы.

 Lazy Evaluation Ленивые вычисления (отложенные) -применяемая в некоторых языках программирования стратегия вычисления, согласно которой вычисления следует откладывать до тех пор, пока не понадобится их результат.

 

Map (отображение) — универсальная абстракция. В каждом языке есть перечислимые типы данных: например, массивы или списки, и для них почти наверняка есть встроенная функция map. Она работает всегда одинаково. Принимает на вход коллекцию и функцию-трансформер, которая берет элемент и возвращает его преобразование (конкретное действие зависит от конкретной ситуации). Различается только способ вызова и иногда порядок аргументов. То же самое касается и любой абстракции, построенной поверх коллекций. Все, что может быть перечислено, может быть отображено. Неизменным в этих отображениях всегда остается количество элементов. Отображенная коллекция элементов всегда такого же размера, как и исходная.

filter — функция для фильтрации списков. Например, её можно использовать для удаления из списка HTML-элементов всех элементов-заголовков. Фильтр не делает никаких преобразований самих элементов.

Аналогично функции map, функция filter принимает два аргумента:

  1. Функция-предикат
  2. Список (набор элементов)

Функция-предикат принимает элемент и возвращает true или false в зависимости от того, следует ли сохранять элемент в итоговом списке или нет.

 Мой Хекслет  JS: Последовательности     6. Свертка

 reduce - 3 аргумента . 1 функция 2ой аккумелятор 3ий список

 

 


Числа Черча

# экспорт функций модуля  
export const Zero = () => x => x;
export const Succ = n => f => x => f(n(f)(x));
# так можно но лучше первый вариант 
export function Zero(){return z => z }
export function Succ(n) {return s => z => s (n (s) (z)) }

 

 

  • Функции как объекты первого рода  (функции =  данные)
  • Функции высшего порядка (функции у которых формальный параметр другая функция)
  • Сложность функции (цикломатическая - сколько ветвлений)
  • Частичное применение - Процесс фиксации части аргументов функции, который создает другую функцию с меньшим количеством аргументов (`const partialApply = (fn, arg1) => (arg2, arg3) => fn(arg1, arg2, arg3);`)
  • Каррирование  — это процесс превращения функции от n аргументов в цепочку вложенных n-функций от одного аргумента. Соответственно, каррированная функция — это множество функций от одного аргумента)

 

 Частичное применение для JS — практически как воздух для живых организмов. Из-за асинхронной природы JS часто бывают ситуации, когда одни параметры функции задаются в одном месте, а другие в другом, так как они становятся доступны только после выполнения асинхронной операции. `export default (f, second) => first => f(first, second);`

Возможно ли частичное применение без замыкания?

- Нет. Частичное применение подразумевает запоминание аргументов функции


Возможно ли каррирование без замыкания?

Нет. Каррирование возможно только благодаря замыканию

Замыкание — это функция, «запомнившая» часть окружения, где она была задана. Функция замыкает в себе идентификаторы (все, что мы определяем) из лексической области видимости.

# есть функция которая принимает два аргумента и замыкает их в функцию
const cons = (x, y) => f => f(x, y);
# в результате будет пара (какая-то функция с двумя известными агрументами)
# чтобы  извлечь аргумент нам надо сделать такую функцию которая вернет его и передать её в пару
const car = pair => pair((x,y)=>x)

 Объектами первого класса в контексте конкретного языка программирования называются элементы, которые могут быть переданы как параметр, возвращены из функции или присвоены переменной. Другими словами, речь идет обо всем, что может быть данными. Самые простые типы данных — это числа и строки. Как вы потом увидите, все остальные типы данных также являются объектами первого класса.

Выражение — код, выполнение которого возвращает значение. Инструкция — код, представляющий собой команду.

  • Выражения — вычисляются.
  • Инструкции — исполняются.

К выражениям относятся:

  • Вызов функции
  • Арифметические и логические операции
  • Тернарный оператор
  • и другие

К инструкциям относятся:

  • for
  • while
  • break
  • return
  • if
  • и другие

 

 

JavaScript — это язык со слабой типизацией. У него есть представление о типах, но он расслаблено к ним относится и может оперировать значениями, можно сказать, произвольно. Чем сильнее система типизации, тем строже правила.

# Способы записи функций
// const <name> = (<argument>) => {
//   return <expressions>;
// };
const identity = (value) => {
  return value;
};
# Существует несколько других. Например, если у вас функция-однострочник, то можно использовать сокращенный синтаксис:
// const <name> = (<argument>) => <expressions>;
const identity = value => value;

// Устаревший синтаксис, предпочтительным является () => {}. Кроме синтаксической разницы есть и семантическая.
// Она связана с пока не изученной темой this.
const identity = function(value) {
  return value;
};
// Такую функцию можно использовать до её определения (в этом же файле).
function identity(value) {
  return value;
}

 Преимущества — лаконичность и захват this, больше никаких.this будет такой, каким он был в момент создания arrow function.
А переменное число параметров реализуется через rest

Тело функции будет обработано точно так же, как и в случае классических функций, за исключением того, что значения специальных переменных this, super и arguments будут вычисляться по-другому. https://habr.com/ru/company/mailru/blog/213455/

var sum = (num1, num2) => { return num1 + num2; }
// эквивалент
var sum = function(num1, num2) { return num1 + num2; };

 

 

Тернарная операция VS условная конструкция if

Между этими двумя элементами языка есть различия. Тернарная, или условная, операция вычисляет и возвращает значение, то есть является выражением. Это значит, что мы можем сохранить результат вычисления этого выражения в константе, например:

const absValue = (num >= 0) ? num : -num;

Условная конструкция if в JavaScript выражением НЕ является. Это инструкция — она выполняет действие, ничего не вычисляя и не возвращая. Как следствие, мы НЕ можем с помощью конструкции if сделать так же:

 

 

Давайте повторим вкратце.

  1. Рекурсия — это когда что-то содержит себя в своём описании.
  2. Рекурсивный процесс — это процесс вычисления с отложенными вычислениями.
  3. Итеративный процесс — это процесс вычисления, когда состояние может быть описано фиксированным количеством значений.

Теперь, после короткого тестового задания будет вероятно самое сложное упражнение этого курса. Но я уверен, что вы его раскусите. А когда вы это сделаете, вы почувствуете себя немного героем, как это было со мной.

 

Суть итеративного процесса — вычисление с фиксированным количеством состояний.

В этом коде реализовано вычисление факториала с применением итеративного процесса. Внутри функции factorialопределяется внутренняя функция iter, которая накапливает аккумулятор, вызываясь рекурсивно. Условие выхода из рекурсии — попытка посчитать число большее, чем нужно.

В этой проверке используется переменная n, которая явно в iter не передавалась. Но благодаря тому, как работают окружения, любые функции (в том числе и вложенные), определенные внутри factorial, имеют к ней доступ. Как видно из кода, n используется как константа, а значит такое использование абсолютно безопасно.

# вычисление факториала
const factorial = (n) => {
  const iter = (counter, acc) => {
    if (counter === 1) {
      return acc;
    }
    return iter(counter - 1, counter * acc);
  };
  return iter(n, 1);
};
# наименьшиц делитель
const smallestDivisor = (num) => {
  if (num<1) return NaN
  const iter = (acc) =>{
    if (acc >= num ) return num
    if (num % acc == 0 ) return acc
    return iter(acc+1)
  }
  return iter(2)
}

 


Слово декларативный происходит от латинского "clarare" — разъяснять, заявлять, делать объявление. Вы разъясняете: я хочу, чтобы факториал n был n умножить на факториал n-1.

Слово императивный происходит от латинского "imperare", что значит "командовать". Вы приказываете чётко передвигаться по шагам — умножать это на это, пока идёт отсчёт и запоминать какие-то числа.

Декларативное — это что. Императивное — это как.

Писать декларативный код, в целом, лучший подход. Ваш код будет легче читать, понимать, и делать что-то новое опираясь на него. Некоторые языки провоцируют вас использовать тот или иной подход, а некоторые вообще не оставляют выбора.

Но в итоге вам нужно будет научиться оценивать, когда императивный подход принесет больше проблем чем решений.

Следить за изменениями – сложно, и буквально несколько переменных могут сделать систему очень сложной для понимания.

От изменения состояния* появляется гора багов, а оператор присваивания (assignment statements), который создает изменения, часто является причинами всего зла во вселенной.


 

С обратными тиками вы можете использовать интерполяцию, вместо конкатенации. Вот, смотрите:

const name = "Alex";
const a = 10;
const b = 12;
console.log(`His name was ${name} and his age was ${a + b}`);

Такой код выведет на экран His name was Alex and his age was 22. Внутрь ${} вы можете поместить любое выражение.

Интерполяция предпочтительнее конкатенации. Мы советуем не использовать конкатенацию вообще. Вот некоторые из причин:

  • Такой код заставляет больше думать, потому что синтаксически + больше смахивает на сложение.
  • Из-за слабой типизации можно легко получить не тот результат. Конкатенация может породить ошибки.
  • Сложные строки при использовании конкатенации невозможно нормально разобрать в голове и понять, как они устроены.

 

 



Детерминированная функция всегда возвращает одинаковое значение при определённом вводе (аргументы).

const surfaceAreaCalculator = (radius) => {
  return 4 * 3.14 * square(radius);
}

surfaceAreaCalculator это детерминированная функция.

Недетерминированная функция не всегда будет возвращать одинаковое значение при определённом вводе.такая ФУНКЦИЯ НЕ МОЖЕТ БЫТЬ ЧИСТОЙ

Функция не является чистой, т.к. хотя она и детерминированная, но обладает побочными эффектами

Побочные эффекты: то, как функция меняет внешний мир.

Чем меньше побочных эффектов имеет функция, тем лучше.

Когда функция детерминированная и не имеет побочных эффектов, мы называем её "чистой" функцией. Чистые функции:

  • проще читать
  • проще отлаживать
  • проще тестировать
  • не зависят от порядка, в котором они вызываются
  • просто запустить параллельно (одновременно

 

 

 

аддитивность расширение функциональности без изменения исходного кода 

про JS

  1. Вязыке нет классов
  2. Класс это функция
  3. Функция это объект
  4. this Не текущий объект