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 типа ошибок:
- Syntax error. Неверное использование языка. Часто лишние или недостающие скобки или кавычки. Что делать? Заменить, удалить или добавить символы. Часто проблема в скобках или кавычках: открытые скобки должны быть закрыты, открытые кавычки должны быть закрыты.
- Reference error. Использование несуществующего названия. Что делать? Проверить, существует ли то, на что вы ссылаетесь. Возможно вы использовали ошибочное название или забыли его создать.
- Type error. Использование неверного типа, например попытка вызвать константу числа, как функцию. Что делать? Убедиться, что всё используется верно. Часто проблема в простой путанице: вы создали численную константу и функциональную константу, а потом пытаетесь вызвать число. Вероятно вы собирались вызвать функцию.
- Logic error. (Логическая ошибка) Ваш код выполняет не то, что требуется, но программа запускается и не выдаёт ошибок трёх перечисленных выше типов. Сломана логика. Что делать? Проверить свой код, убедиться, что он выполняет то, что должен.
Рекурсия
Функции могут вызывать другие функции.
Функция, вычисляющая факториал:
const factorial = (n) => {
if (n === 0) {
return 1;
}
else {
return n * factorial(n-1);
}
}
const answer = factorial(3);
Требования рекурсии
- Простой базовый случай, или терминальный сценарий, или терминальное условие. Простыми словами, когда остановиться. В нашем примере это был 0: мы остановили вычисление факториала, когда достигли 0.
- Правило двигаться по рекурсии, углубляться. В нашем случае, это было n * factorial(n-1).
Рекурсивный процесс
Основная его идея — откладывание вычисления до самого конца. Суть итеративного процесса — вычисление с фиксированным количеством состояний.
Итеративный процесс в целом:
- Определить начальное состояние.
- Проверить терминальный сценарий.
- Определить новое состояние. Это то, как продвигается процесс.
- Повторить шаг 2.
Резюме
- Рекурсия — это когда что-то содержит себя в своём описании.
- Рекурсивный процесс — это процесс обработки данных с отложенными вычислениями.
- Итеративный процесс — это процесс вычисления, когда состояние может быть описано фиксированным количеством значений.
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). Инструкция — это (грубо говоря) команда, действие.
if
, while
, for
, const
— примеры инструкций. Они производят или контролируют действия, но не превращаются в значения.
Выражением (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
имеет побочный эффект: она что-то выводит на экран.
Чистая функция – детерменированная функция, которая не имеет побочных эффектов.
Чем меньше побочных эффектов имеет функция, тем лучше.
Когда функция детерминированная и не имеет побочных эффектов, мы называем её «чистой» функцией. Чистые функции:
- проще читать
- проще отлаживать
- проще тестировать
- не зависят от порядка, в котором они вызываются
- просто запустить параллельно (одновременно)