2. Введение в программирование

У языка программирования есть два аспекта:

  • Синтаксис (правила написания кода, правописание, порядок слов)
  • Семантика (идея, смысловая нагрузка или назначение)

Возведение в степень:

  • Math.pow (2, 4);
  • 2 ** 4;

Nan — not a number (0/«word» = NaN; если в вычислении присутствует NaN, то результатом всегда будет NaN). Infinity / -Infinity — есть положительная и отрицательная бесконечность.

Функции

Строка кода – инструкция. Инструкция должна заканчиваться точкой с запятой.

Есть определенные правила для названий: например, название не должно содержать пробелы и использовать некоторые специфические слова, как const.

Это определение функции:

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

Это вызов функции:

const surfaceOfMars = surfaceAreaCalculator(3390);

Другие способы определения функций:

1.

const identity = (value) => {
return value;
};

2. Функция-однострочник:

const identity = value => value;

3.  с ключевым словом function

3.1.

const identity = function(value) {
  return value;
};

3.2.

function identity(value) {
  return value;
}

Формальными параметрами функции называются имена переменных в определении функции. Например у функции const f = (a, b) => a - b; формальные параметры — это a и b.

Фактические параметры — это то, что было передано в функцию в момент вызова. Например если предыдущую функцию вызвать так f(5, z), где const z = 8, то фактическими параметрами являются 5 и z.

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

Инструкции после return не выполняются.

Условные конструкции

if (условие) then
   выполнить что-то
else if (другое_условие) then
   выполнить что-то другое
else (ни одного из тех условий) then
   выполнить что-то ещё

Условная конструкция if в JavaScript выражением НЕ является.

Сокращённая версия if: она называется тернарным оператором (ternary operator):

condition ? expression : expression

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

То, что даёт ответ TRUE или FALSE, называется предикатом.

Математические предикаты в JavaScript:

  • ===
  • !==
  • >
  • <
  • >=
  • <=
  • && (AND)
  • || (OR)
  • ! (NOT)

Ошибки

Метод утёнка — психологический метод решения задачи, делегирующий её мысленному помощнику. Метод описан в книге «Программист-прагматик».

4 типа ошибок:

  1. Syntax error. Неверное использование языка. Часто лишние или недостающие скобки или кавычки. Что делать? Заменить, удалить или добавить символы. Часто проблема в скобках или кавычках: открытые скобки должны быть закрыты, открытые кавычки должны быть закрыты.
  2. Reference error. Использование несуществующего названия. Что делать? Проверить, существует ли то, на что вы ссылаетесь. Возможно вы использовали ошибочное название или забыли его создать.
  3. Type error. Использование неверного типа, например попытка вызвать константу числа, как функцию. Что делать? Убедиться, что всё используется верно. Часто проблема в простой путанице: вы создали численную константу и функциональную константу, а потом пытаетесь вызвать число. Вероятно вы собирались вызвать функцию.
  4. Logic error. (Логическая ошибка) Ваш код выполняет не то, что требуется, но программа запускается и не выдаёт ошибок трёх перечисленных выше типов. Сломана логика. Что делать? Проверить свой код, убедиться, что он выполняет то, что должен.

Рекурсия

Функции могут вызывать другие функции.

Функция, вычисляющая факториал:

const factorial = (n) => {
  if (n === 0) {
    return 1;
  }
  else {
    return n * factorial(n-1);
  }
}
const answer = factorial(3);

Требования рекурсии

  1. Простой базовый случай, или терминальный сценарий, или терминальное условие. Простыми словами, когда остановиться. В нашем примере это был 0: мы остановили вычисление факториала, когда достигли 0.
  2. Правило двигаться по рекурсии, углубляться. В нашем случае, это было n * factorial(n-1).

Рекурсивный процесс

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

Итеративный процесс в целом:
  1. Определить начальное состояние.
  2. ​Проверить терминальный сценарий.
  3. ​Определить новое состояние. Это то, как продвигается процесс.
  4. Повторить шаг 2.​
Резюме
  1. Рекурсия — это когда что-то содержит себя в своём описании.
  2. Рекурсивный процесс — это процесс обработки данных с отложенными вычислениями.
  3. Итеративный процесс — это процесс вычисления, когда состояние может быть описано фиксированным количеством значений.
const factorial = (n) => {  
  if (n === 0) {
    return 1;
  }
  const iter = (counter, acc) => {
    if (counter === 1) {
      return acc;
    }
    return iter(counter - 1, counter * acc);
  };
  return iter(n, 1);
};

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

let age = 21;

Циклы — это повторяющиеся блоки кода. Цикл while — это блок, повторяющийся пока какое-то состояние истинно.

while (condition) {  
  do_stuff;
}

Итерация — сформулированное повторение кода. 

рекурсивная функция — декларативная — она как бы определение (это что).

Эта нерекурсивная итеративная функция — императивная — описание того, что нужно делать (это как).

 // Postfix
let a = 3;
let b;
b = a++;    // b = 3, a = 4
// Prefix
let a = 3;
let b;
b = ++a;    // b = 4, a = 4

все 3 выражения в цикле for не обязательны.

Тесты

Тесты — это кусочки кода, которые проверяют, что другой код работает правильно.

assert(); // проверяет, что результат  является истиной.
assert.equal(, ); //проверяет, что  и  равны (проверка на нестрогое равенство ==)

Импорт функций

import something1 from './math.js'; - импорт экспортированного по умолчанию
import * as mathematics from './math.js';
const surfaceOfMars = mathematics.surfaceArea(3390);

import { surfaceArea, square } from './math.js';

При использовании ключевого слова import необходимо указать расширение файла. 

export default surfaceArea;
export const pi = 3.14;

Один модуль – один файл.

Выражения (expressions) и инструкции (statements). Инструкция — это (грубо говоря) команда, действие.

ifwhileforconst — примеры инструкций. Они производят или контролируют действия, но не превращаются в значения.

Выражением (expression) является любой корректный блок кода, который возвращает значение. 

  • Область видимости (scope) компонентов — это местоположение, где эти компоненты доступны.
  • Компоненты, созданные снаружи функций, инструкций с if, циклов и так далее, находятся в глобальной области видимости
  • Фигурные скобки { } задают новую локальную область видимости

Замыкания

const createPrinter = () => {
  const name = "King";
  const printName = () => {
    console.log(name);
  }
  return printName;
}

const myPrinter = createPrinter();
myPrinter();    // King

В JavaScript кроме undefined существует null

null нужен для явного, намеренного указания, что значения нет. 

null, в отличие от undefined, можно задавать вручную, передавать как аргумент в функцию и в целом использовать как любое другое явное значение.

(undefined тоже можно задавать вручную, но никогда не нужно этого делать: это значение семантически создано только для того, чтобы его генерировал компьютер, а не программист)

typeof null;          // "object" (не "null" по историческим причинам)
typeof undefined;     // "undefined"
null === undefined;   // false
null == undefined;    // true
null === null;        // true
null == null;         // true
!null;                // true
!null;                // true
isNaN(1 + undefined); //true
isNaN(1 + undefined); //true

Типизация

Статически типизированные языки проверяют типы и ищут ошибки типизации на стадии компиляции.

Динамически типизированные языки проверяют типы и ищут ошибки типизации на стадии исполнения.

Иными словами: статическое типизирование означает проверку типов перед запуском программы; динамическое — проверку типов пока программа запущена.

Слабая / сильная

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

1 === '1';    // false
1 == '1';     // true
true === 1;   // false
true == 1;    // true
4 + '7';      // '47'
4 * '7';      // 28
2 + true;     // 3
false - 3;    // -3

[] + [] // ' '
[] + {} // [object Object
{} + [] // 0
{} + {} // NaN

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

Недетерминированная функция не всегда будет возвращать одинаковое значение при определённом вводе.

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

Функция console.log имеет побочный эффект: она что-то выводит на экран.

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

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

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

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

You may also like...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *