Сценарии выполняемые на стороне клиента.
Развитие HTML от <b>
и <i>
до семантических тегов и разных событий таких как :hover
.
Далее встал вопрос о внедрении компьютерных программ в гипертекст. Так как программа - это тоже текст.
К этому времени обработкой гипертекста уже занимался браузер, поэтому и программы внедряемые в этот гипертекст так же предстояло браузеру.
Появление Сценариев
.
В начале пути ЯП работали с помощью преобразования программного кода в исполняемый код на языке компьютера. Такой код так же называют исполняемым
(native). Такой код представляет собой файл с расширением .exe
(executable
). Представители компилируемых языков: С++ Delphi, Assembler, Fortran
Для лучшей совместимости программ развивалась транслирующая технология. Транслятор преобразовывал код программы в байт-код. Имея такой транслятор обеспечение совместимости стало проблемой разработчиков платформ. Для запуска такой платформы (программы) необходимо установить и запустить платформу. Примеры таких языков: Java, C#, Python и т.д.
Ни одиин ни второй сценарий не подходили для реализации кода для гипертекстовой разметки. Язык для разметки должен был просто выполнять команды, при этом не иметь доступа к системе напрямую. Схема выполнения таких программ получила название - интерпретатора
.
Программы в виде исходного кода для интерпретирующих систем получила название скрипт
(сценарий). В веб-разработке скриптами называют текстовые вставки в HTML документ, обрабатываемые браузером как программы.
Язык JavaScript непосредственно поддерживается всеми современными браузерами и не требует никаких дополнительных подключенных библиотек или установленных расширений. Его можно добавлять прямо в тег <script></script>
.
JavaScript имеет общирные возможности для работы с данными: арифметические, логические, символьные операции. Может управлять содержимым веб-страницы. с помощью этого языка можно связаться с сервером, отправлять и получать данные.
Ограницения JS по работе с файлами компьютера. Ограничения JS с работой со вкладками создаными не им. Ограничен обмен данными с сервером.
JavaScript был создан Бренданом Айком в мае 1995 года за рекордные десять дней. Изначально язык назывался Mocha, затем LiveScript, но в конечном итоге получил название JavaScript. Он был разработан для браузера Netscape Navigator с целью добавления динамических и интерактивных элементов на статические HTML-страницы. Переименование в JavaScript было связано с желанием привлечь внимание к языку, используя популярность Java в то время.
JavaScript основан на стандарте ECMAScript, который был разработан для обеспечения совместимости скриптовых языков, включая JavaScript. Стандарт ECMAScript стандартизирован организацией Ecma International и описывает синтаксис, типы данных, операторов и другие ключевые аспекты языка.
Первый стандарт, ECMAScript 1, был опубликован в 1997 году. С тех пор язык прошел через множество обновлений, включая значительные версии, такие как ES5 (2009) и ES6 (2015), которые добавили множество новых функций и улучшений. Начиная с 2015 года, новые версии стандарта стали обозначаться по году выпуска, например, ES2016, ES2017 и так далее.
BOM (Browser Object Model) — это модель объектов браузера, которая позволяет JavaScript взаимодействовать с браузером и управлять его функциональностью. BOM предоставляет доступ к различным элементам браузера, таким как окно, история, местоположение и другие.
Примеры использования BOM
- Объект window: Позволяет управлять окнами браузера.
window.alert("Привет, мир!"); // Показывает всплывающее окно с сообщением
- Объект location: Позволяет получать и изменять URL текущей страницы.
console.log(window.location.href); // Выводит текущий URL
window.location.href = "https://example.com"; // Перенаправляет на новый URL
- Объект history: Позволяет управлять историей навигации.
window.history.back(); // Возвращает на предыдущую страницу
DOM (Document Object Model) — это объектная модель документа, которая представляет HTML или XML документ в виде структуры дерева. Каждый элемент документа (теги, текст, атрибуты) является узлом в этом дереве, что позволяет программно взаимодействовать с содержимым и структурой веб-страницы.
Примеры использования DOM
- Получение элемента по ID:
const element = document.getElementById("myElement");
- Изменение текста элемента:
element.textContent = "Новый текст!";
- Добавление обработчика события:
element.addEventListener("click", function () {
alert("Элемент был нажат!");
});
- Создание и добавление нового элемента:
const newDiv = document.createElement("div");
newDiv.textContent = "Я новый элемент!";
document.body.appendChild(newDiv);
DOM позволяет динамически изменять содержимое веб-страниц без перезагрузки, что делает его важным инструментом для создания интерактивных веб-приложений.
Тег <noscript>
используется для отображения контента, если в браузере отключены скрипты или если браузер не поддерживает JavaScript. Это позволяет разработчикам предоставлять альтернативную информацию или инструкции пользователям, у которых отключены скрипты.
<noscript>
<p>
JavaScript отключен в вашем браузере. Пожалуйста, включите его для полного
функционала сайта.
</p>
</noscript>
Как отключить скрипты в браузере Chrome:
- Нажмите на значок меню (три вертикальные точки) в правом верхнем углу.
- Выберите Настройки.
- Прокрутите вниз и нажмите на Дополнительные.
- В разделе Конфиденциальность и безопасность выберите Настройки сайтов.
- Найдите раздел JavaScript и выберите Запретить всем сайтам запускать JavaScript.
Синтаксис — это набор правил, определяющих структуру и форму программного кода. Он описывает, как правильно составлять конструкции языка, такие как операторы, выражения и команды.
Семантика — это значение и смысл синтаксических конструкций. Она определяет, что именно происходит, когда код выполняется.
Синтаксис отвечает на вопрос "Как?", а семантика — "Что?" происходит в программе.
Синтаксические ошибки — это ошибки, возникающие из-за нарушения правил языка программирования.
function example() {
console.log("Hello, world!"; // Ошибка: отсутствует закрывающая скобка
}
Семантические ошибки — это ошибки, которые возникают, когда код синтаксически правильный, но выполняет неправильные действия или дает неверные результаты.
let a = 10;
let b = 0;
let result = a / b; // Ошибка: деление на ноль, результат будет бесконечность
Регистрозависимость — это свойство языков программирования, при котором различается верхний и нижний регистры букв. Это означает, что идентификаторы (например, имена переменных, функций и классов) с разным регистром считаются разными.
let variable = 5;
let Variable = 10;
console.log(variable); // Выведет 5
console.log(Variable); // Выведет 10
JavaScript является регистрозависимым языком программирования.
В JavaScript используются два типа комментариев:
- Однострочные комментарии: начинаются с двух косых черт //. Все, что написано после этих символов до конца строки, игнорируется интерпретатором.
// Это однострочный комментарий
let x = 5; // Переменная x равна 5
- Многострочные комментарии: заключаются между /_ и _/. Они могут занимать несколько строк.
/*
Это многострочный комментарий,
который может занимать несколько строк.
*/
let y = 10;
Ключевые слова — это слова, которые имеют специальное значение в языке программирования и используются для выполнения определенных операций. Например, if, else, for, while, function и т.д.
Зарезервированные слова — это слова, которые нельзя использовать в качестве имен переменных, функций или других идентификаторов, так как они уже имеют предопределенное значение в языке. Использование зарезервированных слов в качестве имен приведет к ошибкам. Например: break, const, continue
Переменные — это именованные области памяти, используемые для хранения данных. В JavaScript переменные могут хранить различные типы данных, такие как числа, строки, массивы и объекты.
Правила наименования переменных:
- Начало с буквы, знака доллара или подчеркивания: Имя переменной должно начинаться с буквы (a-z, A-Z), знака доллара $ или подчеркивания _. Например:
$amount = 100;
- Использование букв, цифр, знаков доллара и подчеркивания: После первого символа имя может содержать буквы, цифры (0-9), знаки доллара и подчеркивания. Пример:
let user1 = "John";
. - Регистрозависимость: Имена переменных чувствительны к регистру, то есть myVar и myvar — это разные переменные.
- Запрет на использование ключевых и зарезервированных слов: Нельзя использовать слова, которые имеют специальное значение в JavaScript, такие как if, for, function и т.д.
- Четкость и понятность: Имена переменных должны быть описательными и отражать суть хранимых данных. Например, вместо x лучше использовать userAge для хранения возраста пользователя.
Хорошие имена переменных:
userAge
— ясно указывает, что переменная хранит возраст пользователя.totalPrice
— понятно, что переменная содержит общую стоимость.isLoggedIn
— логическое значение, указывающее, вошел ли пользователь в систему.fetchUserData
— имя функции, которое четко описывает ее действие. Плохие имена переменных:a
— слишком общее и неинформативное имя.temp
— неясно, что именно временное; может быть множество значений.data
— слишком расплывчатое; не указывает, какие данные хранятся.x1
,x2
,x3
— неинформативные имена, не дающие представления о содержимом переменных.
В JavaScript существует восемь основных типов данных, которые можно разделить на две категории: примитивные и ссылочные.
Примитивные типы данных:
Number
: представляет числовые значения, как целые, так и дробные.
let age = 25; // Целое число
let price = 19.99; // Дробное число
String
: представляет последовательности символов.
let name = "Alice"; // Строка
Boolean
: представляет логические значения: true или false.
let isActive = true; // Логическое значение
Undefined
: тип, который указывает, что переменная была объявлена, но не инициализирована.
let x; // x имеет значение undefined
Null
: специальное значение, которое указывает на отсутствие значения.
let y = null; // y явно установлен в null
Symbol
: уникальный и неизменяемый тип данных, используемый для создания уникальных идентификаторов.
let sym = Symbol("description"); // Символ
BigInt
: позволяет работать с целыми числами произвольной длины.
let bigNumber = BigInt(123456789012345678901234567890); // Большое целое число
Ссылочный тип данных:
Object
: представляет коллекции значений и более сложные сущности.
let person = {
name: "Bob",
age: 30,
}; // Объект
Типизация в языках программирования определяет, как и когда типы данных переменных проверяются и определяются. Существует два основных подхода к типизации: статическая и динамическая.
-
Статическая типизация. В языках с статической типизацией тип переменной определяется на этапе компиляции, и ошибки, связанные с типами, могут быть обнаружены до выполнения программы. Это позволяет разработчикам заранее знать, какие типы данных используются, что может повысить безопасность и производительность кода.
-
Динамическая типизация. В языках с динамической типизацией тип переменной определяется во время выполнения программы. Это означает, что одна и та же переменная может содержать значения разных типов в разное время. Динамическая типизация обеспечивает большую гибкость, но может привести к ошибкам, которые будут обнаружены только во время выполнения.
Операторы — это специальные символы или ключевые слова, которые выполняют операции над операндами (значениями или переменными). В JavaScript операторы позволяют выполнять математические вычисления, сравнения, логические операции и другие действия.
Каждая операция в JavaScript состоит из операторов и операндов. Операнды — это значения или переменные, над которыми выполняется операция. Например, в выражении 5 + 3, + — это оператор, а 5 и 3 — операнды.
Арифметические операторы в JavaScript используются для выполнения математических операций над числовыми значениями (операндами). Большинство арифметических операторов являются бинарными, так как они выполняют вычисления над двумя операндами, но некоторые из них могут быть унарными.
- Сложение (+): Складывает два числа.
let sum = 5 + 3; // sum равно 8
- Вычитание (-): Вычитает одно число из другого.
let difference = 10 - 4; // difference равно 6
- Умножение (*): Умножает два числа.
let product = 7 * 2; // product равно 14
- Деление (/): Делит одно число на другое.
let quotient = 20 / 4; // quotient равно 5
- Остаток от деления (%): Возвращает остаток от деления одного числа на другое.
let remainder = 10 % 3; // remainder равно 1
- Инкремент (++): Увеличивает значение переменной на 1.
let count = 1;
count++; // count теперь равно 2
- Декремент (--): Уменьшает значение переменной на 1.
let count = 2;
count--; // count теперь равно 1
В JavaScript операторы отношений используются для сравнения значений и возвращают логическое значение true или false. Основные операторы отношений включают:
Равно (==)
: проверяет, равны ли два значения, при этом может приводить их к одному типу.Строгое равно (===)
: проверяет, равны ли два значения и имеют ли они одинаковый тип.Не равно (!=)
: проверяет, не равны ли два значения, также может приводить их к одному типу.Строгое не равно (!==)
: проверяет, не равны ли два значения и имеют ли они разные типы.Больше (>)
,меньше (<)
,больше или равно (>=)
,меньше или равно (<=)
: используются для сравнения чисел.
Примеры операторов сравнения:
- Нестрогое сравнение:
console.log(5 == "5"); // true, так как строка '5' приводится к числу
- Строгое сравнение:
console.log(5 === "5"); // false, так как типы разные (number и string)
- Неравенство:
console.log(5 != "5"); // false, так как значения равны после приведения типов
Строгое неравенство:
console.log(5 !== "5"); // true, так как типы разные
Сравнение чисел:
console.log(10 > 5); // true
console.log(10 <= 10); // true
- Нестрогое сравнение (== и !=) приводит значения к одному типу перед сравнением. Это может привести к неожиданным результатам, если не учитывать типы данных.
- Строгое сравнение (=== и !==) не приводит значения к одному типу, что делает его более предсказуемым и безопасным для использования. Рекомендуется использовать строгое сравнение, чтобы избежать ошибок, связанных с неявным приведением типов.
В JavaScript для сравнения чисел используются операторы, такие как >
, <
, >=
, <=
, ===
и !==
. Эти операторы работают аналогично математическим сравнениям.
Например:
- 5 > 3 вернет true, так как 5 больше 3.
- 10 <= 10 вернет true, так как 10 равно 10.
###Сравнение строк в JavaScript Для сравнения строк в JavaScript также используются операторы >, <, >=, <=, === и !==. Однако, при сравнении строк важно учитывать, что строки сравниваются по их лексикографическому порядку, то есть по порядку символов в кодировке Unicode.
Например:
- 'Ava' < 'Zoe' вернет true, так как 'A' меньше 'Z' по порядку символов.
Рекомендуется использовать оператор === для сравнения строк, так как он проверяет как значение, так и тип данных, что помогает избежать ошибок, связанных с неявным преобразованием типов, которое происходит при использовании ==.
// Сравнение чисел
console.log(5 > 3); // true
console.log(10 <= 10); // true
// Сравнение строк
console.log("apple" < "banana"); // true
console.log("Ava" > "Zoe"); // false
// Сравнение строк с числами
console.log("70px" > "622px"); // true, сравнение по символам
Когда вы сравниваете строку '6' с числом 6, JavaScript автоматически приводит строку к числу, если используется оператор ==.
console.log("6" == 6); // true
если вы используете оператор строгого равенства ===, то сравнение будет учитывать типы данных, и результат будет false, так как строка и число имеют разные типы:
console.log("6" === 6); // false
В JavaScript оператор + может использоваться не только для сложения чисел, но и для преобразования строк в числа. Когда вы применяете оператор + к строке, содержащей числовое значение, JavaScript автоматически преобразует эту строку в число. Например:
let str = "6";
let num = +str; // Преобразование строки в число
console.log(num); // 6
console.log(typeof num); // 'number'
Если строка не может быть преобразована в число (например, если она содержит буквы или специальные символы), результатом будет NaN (Not-a-Number):
let invalidStr = "abc";
let result = +invalidStr; // Преобразование некорректной строки
console.log(result); // NaN
В JavaScript логические операторы позволяют выполнять логические операции над значениями, обычно булевыми (true или false)
. Основные логические операторы — это И (&&)
, ИЛИ (||)
и НЕ (!)
.
Оператор И возвращает true только в том случае, если оба операнда истинны. Если хотя бы один из операндов ложен, результат будет false. Например:
console.log(true && true); // true
console.log(true && false); // false
console.log(false && false); // false
Оператор ИЛИ возвращает true, если хотя бы один из операндов истинный. Он будет false только в случае, если оба операнда ложны. Например:
console.log(true || false); // true
console.log(false || false); // false
console.log(true || true); // true
Оператор НЕ инвертирует логическое значение. Если операнд истинный, он возвращает false, и наоборот. Например:
console.log(!true); // false
console.log(!false); // true
Оператор присваивания в JavaScript используется для присвоения значения переменной. Общий синтаксис простого присваивания выглядит следующим образом:
Оператор присваивания имеет правую ассоциативность, что означает, что выражения справа от оператора будут вычислены первыми. Например:
let a, b;
a = b = 10; // Сначала b присваивается 10, затем a получает значение b
console.log(a); // 10
console.log(b); // 10
Вы можете присваивать одно и то же значение нескольким переменным одновременно:
let x = (y = z = 5); // Все переменные x, y и z будут равны 5
JavaScript также поддерживает комбинированные операторы присваивания, которые позволяют выполнять операции и присваивать результат в одном выражении. Например:
let num = 10;
num += 5; // Это эквивалентно num = num + 5;
console.log(num); // 15
Приоритет операторов определяет порядок, в котором операторы выполняются в выражениях.
Таблица операторов:
Рассмотрим пример, чтобы проиллюстрировать, как работает приоритет операторов:
let a = 5;
let b = 10;
let c = 15;
let result = a + b * c; // Умножение выполняется первым
console.log(result); // 5 + (10 * 15) = 5 + 150 = 155
Оператор typeof в JavaScript используется для определения типа данных переменной или значения. Он возвращает строку, указывающую тип операнда, который следует за оператором.
Оператор typeof может использоваться как с круглой скобкой, так и без нее. Оба варианта работают одинаково:
console.log(typeof "Hello"); // 'string'
console.log(typeof 42); // 'number'
console.log(typeof true); // 'boolean'
console.log(typeof {}); // 'object'
console.log(typeof null); // 'object' (это известная особенность JavaScript)
console.log(typeof undefined); // 'undefined'
Вот несколько примеров, демонстрирующих использование оператора typeof:
let name = "Alice";
let age = 30;
let isStudent = false;
let data = null;
let obj = { key: "value" };
let arr = [1, 2, 3];
console.log(typeof name); // 'string'
console.log(typeof age); // 'number'
console.log(typeof isStudent); // 'boolean'
console.log(typeof data); // 'object'
console.log(typeof obj); // 'object'
console.log(typeof arr); // 'object'
console.log(typeof function () {}); // 'function'
JavaScript предоставляет несколько встроенных методов для взаимодействия с пользователем через диалоговые окна. Основные из них — это alert(), confirm() и prompt().
Метод alert() используется для отображения простого модального окна с сообщением и одной кнопкой "OK". Это окно блокирует взаимодействие с остальной частью страницы, пока пользователь не закроет его. Например:
alert("Это сообщение для пользователя!");
Метод confirm() отображает диалоговое окно с сообщением и двумя кнопками: "OK" и "Cancel". Он возвращает true, если пользователь нажал "OK", и false, если нажал "Cancel". Это позволяет разработчикам запрашивать подтверждение у пользователя перед выполнением какого-либо действия. Например:
let userConfirmed = confirm("Вы уверены, что хотите продолжить?");
if (userConfirmed) {
console.log("Пользователь подтвердил действие.");
} else {
console.log("Пользователь отменил действие.");
}
Метод prompt() выводит диалоговое окно с текстовым полем для ввода и двумя кнопками: "OK" и "Cancel". Он позволяет пользователю ввести текст, который затем можно использовать в программе. Если пользователь нажимает "OK", возвращается введенный текст; если "Cancel" — возвращается null. Например:
let userInput = prompt("Введите ваше имя:");
if (userInput !== null) {
console.log("Привет, " + userInput + "!");
} else {
console.log("Пользователь отменил ввод.");
}
Условие — это выражение, которое может быть истинным (true) или ложным (false).
Условия используются для управления потоком выполнения программы, позволяя выполнять определенные действия в зависимости от результата проверки.
Оператор if в JavaScript позволяет выполнять блок кода только в том случае, если указанное условие истинно. Синтаксис оператора if выглядит следующим образом:
if (условие) {
// Код, который выполняется, если условие истинно
}
Если условие возвращает true, выполняется код внутри фигурных скобок. Если условие возвращает false, код пропускается.
Пример использования оператора if: Рассмотрим простой пример, где мы проверяем, является ли число положительным:
let number = 5;
if (number > 0) {
console.log("Число положительное.");
}
Вы также можете использовать оператор else, чтобы выполнить другой блок кода, если условие ложно:
let number = -3;
if (number > 0) {
console.log("Число положительное.");
} else {
console.log("Число неположительное.");
}
В этом случае, поскольку number меньше нуля, будет выведено сообщение "Число неположительное."
Если вам нужно проверить несколько условий, вы можете использовать else if:
let number = 0;
if (number > 0) {
console.log("Число положительное.");
} else if (number < 0) {
console.log("Число отрицательное.");
} else {
console.log("Число равно нулю.");
}
В этом примере программа проверяет три условия и выводит соответствующее сообщение в зависимости от значения переменной number.
Тернарный оператор — это сокращенная форма условного оператора, которая позволяет выполнять условные проверки и возвращать значения в компактном виде. Он состоит из трех частей: условия
, значения, возвращаемого при истинном условии
, и значения, возвращаемого при ложном условии
.
let number = 4;
let result = number % 2 === 0 ? "Четное" : "Нечетное";
console.log(result); // "Четное"
Несмотря на свои преимущества, тернарный оператор не всегда является лучшим выбором. Если условие сложное или если необходимо выполнить несколько действий в зависимости от условия, лучше использовать оператор if.
Конструкция switch в JavaScript используется для выполнения различных действий на основе различных условий. Это удобный способ обработки множества возможных значений одной переменной, что делает код более читаемым и структурированным по сравнению с множественными операторами if.
switch (выражение) {
case значение1:
// Код, который выполняется, если выражение равно значение1
break;
case значение2:
// Код, который выполняется, если выражение равно значение2
break;
// Можно добавить дополнительные case
default:
// Код, который выполняется, если ни одно из значений не совпадает
}
let day = 3;
let dayName;
switch (day) {
case 1:
dayName = "Понедельник";
break;
case 2:
dayName = "Вторник";
break;
case 3:
dayName = "Среда";
break;
case 4:
dayName = "Четверг";
break;
case 5:
dayName = "Пятница";
break;
case 6:
dayName = "Суббота";
break;
case 7:
dayName = "Воскресенье";
break;
default:
dayName = "Некорректный номер дня";
}
console.log(dayName); // "Среда"
break
: После каждого блока case обычно используется оператор break, чтобы предотвратить "проваливание" в следующий блок. Если break не указан, выполнение продолжится в следующем case, даже если его условие не выполнено.default
: Блок default выполняется, если ни одно из условий не совпадает. Это аналогично else в конструкции if.Типы данных
: Конструкция switch использует строгое сравнение (===), поэтому типы данных также должны совпадать.
Циклы в программировании — это конструкции, которые позволяют многократно выполнять один и тот же набор инструкций. Они являются важным инструментом, который помогает избежать излишнего повторения кода и автоматизировать выполнение повторяющихся задач. Циклы позволяют программистам эффективно управлять потоком выполнения программы, выполняя определенные действия до тех пор, пока не будет выполнено заданное условие.
- Цикл с предусловием (while): Этот цикл выполняется, пока заданное условие истинно. Если условие ложно с самого начала, тело цикла может не выполниться ни разу.
while (condition) {
// код для выполнения
}
- Цикл с постусловием (do-while): Этот цикл выполняется хотя бы один раз, так как условие проверяется после выполнения тела цикла.
do {
// код для выполнения
} while (condition);
- Цикл с параметром (for): Этот цикл используется, когда известно количество итераций. Он включает инициализацию, условие и изменение счетчика в одном выражении.
for (let i = 0; i < 10; i++) {
// код для выполнения
}
Циклы позволяют:
- Автоматизировать повторяющиеся задачи: Например, обработка элементов массива или выполнение одной и той же операции несколько раз.
- Упрощать код: Вместо написания одного и того же кода несколько раз, можно использовать цикл, что делает код более чистым и понятным.
- Управлять потоком выполнения: Циклы позволяют динамически изменять количество итераций в зависимости от условий, что делает программы более гибкими.
Цикл while в JavaScript используется для выполнения блока кода, пока заданное условие истинно. Это позволяет многократно выполнять одну и ту же операцию без необходимости повторять код. Он особенно полезен, когда количество итераций заранее не известно.
Рассмотрим простой пример, где мы используем цикл while для создания счетчика, который выводит числа от 1 до 5:
let counter = 1;
while (counter <= 5) {
console.log(counter);
counter++; // Увеличиваем счетчик на 1
}
Подсчет суммы чисел от 1 до 10:
let sum = 0;
let number = 1;
while (number <= 10) {
sum += number; // Добавляем текущее число к сумме
number++; // Увеличиваем число на 1
}
console.log("Сумма чисел от 1 до 10:", sum); // Вывод: 55
let initialAmount = 1000; // Начальная сумма вклада
let interestRate = 0.1; // Ставка 10% годовых
let years = 0; // Количество лет
while (initialAmount < 2000) {
// Продолжаем, пока сумма не достигнет 2000
let interest = initialAmount * interestRate; // Начисление процентов
initialAmount += interest; // Добавление процентов к сумме
years++; // Увеличение количества лет
}
console.log(`Через ${years} лет сумма вклада достигнет 2000 рублей.`);
В этом примере мы начинаем с начальной суммы вклада 1000 рублей и ставки 10% годовых. Пока сумма вклада не достигнет 2000 рублей, мы продолжаем начислять проценты и увеличивать количество лет. В конце мы выводим, сколько лет потребуется, чтобы сумма вклада достигла 2000 рублей.
Цикл do while в JavaScript выполняет блок кода как минимум один раз, а затем продолжает выполнение, пока заданное условие остается истинным. Это отличие от обычного цикла while, который может не выполниться ни разу, если условие изначально ложно.
Рассмотрим пример, где мы используем цикл do while для создания счетчика, который будет выводить числа от 1 до 5:
let number = 1;
do {
console.log(`Число: ${number}`);
number++;
} while (number <= 5);
let answer;
do {
answer = prompt("Пожалуйста, введите 'yes' или 'no':").toLowerCase();
} while (answer !== "yes" && answer !== "no");
console.log(`Вы ввели: ${answer}`);
В этом примере программа будет запрашивать у пользователя ввод, пока он не введет "yes" или "no". Цикл do while гарантирует, что запрос будет выполнен хотя бы один раз. После того как пользователь введет корректный ответ, программа завершит выполнение и выведет введенное значение в консоль.
Цикл For. Все способы записи (если не указывать блоки инициализации, условия и изменение переменной). Пример для реализации: рассчет ежемесячных платежей кредита, оформленного на год со ставкой 20%.
Цикл for в JavaScript используется для выполнения блока кода несколько раз, и его синтаксис позволяет задавать три основных компонента: инициализацию, условие и изменение переменной. Однако, эти блоки могут быть опущены, что делает цикл for очень гибким.
for (let i = 0; i < 5; i++) {
console.log(`Счетчик: ${i}`);
}
let i = 0;
for (; i < 5; ) {
console.log(`Счетчик: ${i}`);
i++;
}
let i = 0;
for (;;) {
if (i >= 5) break; // Условие выхода из цикла
console.log(`Счетчик: ${i}`);
i++;
}
let fund = +prompt("Credit sum");
let creditBody = fund + 0.2 * fund;
let monthlyPayment = creditBody / 12;
for (let month = 1; month <= 12; month++) {
console.log("month " + month + " payment " + monthlyPayment.toFixed(2));
}
Метод toFixed(2)
: Этот метод округляет число до двух десятичных знаков и возвращает его в виде строки. Например, если monthlyPayment равно 250.5
, то monthlyPayment.toFixed(2)
вернет строку "250.50"
.
Циклы for...in и for...of в JavaScript используются для перебора элементов, но они предназначены для разных целей и работают с различными типами данных. Давайте рассмотрим их подробнее.
Цикл for...in используется для перебора свойств объектов. Он возвращает ключи (имена свойств) объекта, что делает его полезным для работы с объектами.
Пример использования for...in с объектом
let person = {
name: "Alice",
age: 30,
city: "New York",
};
for (let key in person) {
console.log(`${key}: ${person[key]}`);
}
Цикл for...of используется для перебора значений итерируемых объектов, таких как массивы, строки и другие коллекции. Он возвращает значения элементов, что делает его более подходящим для работы с массивами.
Пример использования for...of с массивом
let fruits = ["apple", "banana", "cherry", "date"];
for (let fruit of fruits) {
console.log(`Значение: ${fruit}`);
}
-
for...in:
- Перебирает ключи (имена свойств) объекта.
- Подходит для работы с объектами.
- Может возвращать неожиданные результаты при использовании с массивами, если в массив добавлены нестандартные свойства.
-
for...of:
- Перебирает значения итерируемых объектов (например, массивов).
- Подходит для работы с массивами и другими коллекциями.
- Более предсказуем в использовании с массивами.
Операторы break и continue используются для управления потоком выполнения циклов в JavaScript. Они позволяют изменять стандартное поведение циклов, что может быть полезно в различных ситуациях.
Оператор break используется для преждевременного завершения цикла. Когда break выполняется, цикл немедленно прекращает свою работу, и управление передается на следующую строку кода после цикла.
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
for (let i = 0; i < numbers.length; i++) {
if (numbers[i] === 5) {
console.log("Найдено число 5, выходим из цикла.");
break; // Прерываем цикл
}
console.log(numbers[i]);
}
Оператор continue используется для пропуска текущей итерации цикла и перехода к следующей. Когда continue выполняется, оставшаяся часть кода в текущей итерации пропускается, и цикл продолжает выполнение со следующей итерации.
for (let i = 1; i <= 10; i++) {
if (i % 2 === 0) {
continue; // Пропускаем четные числа
}
console.log(i);
}
Операторы break и continue в JavaScript являются мощными инструментами для управления потоком выполнения циклов. break позволяет завершить цикл, когда это необходимо, а continue — пропустить текущую итерацию и продолжить с следующей. Понимание этих операторов поможет вам писать более эффективный и управляемый код.
Метка в программировании — это специальный идентификатор, который используется для обозначения определенной точки в коде. Метки могут быть применены в различных контекстах, но чаще всего они используются в сочетании с операторами управления потоком, такими как break и continue, для управления выполнением вложенных циклов.
Метки позволяют более точно управлять потоком выполнения программы, особенно когда у вас есть вложенные циклы. С помощью меток можно указать, из какого именно цикла нужно выйти или к какому циклу перейти.
Рассмотрим пример, где мы используем метку для выхода из вложенного цикла:
// Это метка для внешнего цикла
outerLoop: for (let i = 0; i < 3; i++) {
console.log(`Внешний цикл: ${i}`);
for (let j = 0; j < 3; j++) {
if (j === 1) {
console.log(`Выход из внешнего цикла при j = ${j}`);
break outerLoop; // Выход из внешнего цикла
}
console.log(` Внутренний цикл: ${j}`);
}
}
Функция в программировании — это обособленный участок кода, который выполняет определённую задачу. Функции позволяют организовать код, делая его более структурированным и удобным для понимания. Они могут принимать входные данные (аргументы), выполнять операции и возвращать результат.
- Повторное использование кода: Функции позволяют избежать дублирования кода. Один и тот же участок кода можно вызывать несколько раз из разных мест программы.
- Упрощение отладки: Разделение кода на функции облегчает поиск и исправление ошибок, так как каждая функция отвечает за конкретную задачу.
- Улучшение читаемости: Код, организованный с использованием функций, становится более понятным и структурированным, что облегчает его чтение и поддержку.
- Модульность: Функции способствуют созданию модульного кода, где каждая функция может быть разработана и протестирована отдельно.
В JavaScript базовая функция объявляется с помощью ключевого слова function
, за которым следует имя функции
, круглые скобки
(в которых могут быть указаны параметры), и фигурные скобки
, содержащие тело функции
.
Синтаксис:
function имяФункции() {
// тело функции
}
Пример:
function sayHello() {
console.log("Привет, мир!");
}
Чтобы вызвать функцию, просто используйте её имя, добавив круглые скобки с аргументами, если они необходимы:
sayHello(); // Вызов функции, вывод: Привет, мир!
function createHeaders() {
for (let i = 1; i <= 5; i++) {
document.write("<h2>Header " + i + "</h2>");
}
}
createHeaders(); // Вызов функции
Параметры функции в JavaScript позволяют передавать значения в функцию, чтобы она могла использовать их в своем теле.
function createHeaders(count) {
for (let i = 1; i <= count; i++) {
document.write("<h2>Header " + i + "</h2>");
}
}
createHeaders(5); // Вызов функции для создания 5 заголовков
function createHeaders(count, headerText) {
for (let i = 1; i <= count; i++) {
document.write("<h2>" + headerText + " " + i + "</h2>");
}
}
let userInput = prompt("Текст для промпта");
createHeaders(5, userInput);
function incAndLog(x) {
x = x + 1;
alert("inc x = " + x);
Log.innerHTML += "<br>inc x = " + x;
}
x = 2;
Log.innerHTML = "x = " + x;
incAndLog(x);
Log.innerHTML += "<br>x = " + x;
В JavaScript функции могут возвращать значения с помощью ключевого слова return. Когда функция достигает оператора return, она завершает свое выполнение и возвращает указанное значение. Если return не указан, функция возвращает undefined.
function add(a, b) {
return a + b; // Возвращает сумму a и b
}
let result = add(3, 4);
console.log(result); // Вывод: 7
function checkNumber(num) {
if (num > 0) {
return "Положительное число"; // Возвращает строку, если число положительное
} else if (num < 0) {
return "Отрицательное число"; // Возвращает строку, если число отрицательное
} else {
return "Ноль"; // Возвращает строку, если число равно нулю
}
}
console.log(checkNumber(5)); // Вывод: Положительное число
console.log(checkNumber(-3)); // Вывод: Отрицательное число
console.log(checkNumber(0)); // Вывод: Ноль
function getGreeting(hour) {
if (hour < 12) {
return "Доброе утро"; // Возвращает утреннее приветствие
} else if (hour < 18) {
return "Добрый день"; // Возвращает дневное приветствие
} else {
return "Добрый вечер"; // Возвращает вечернее приветствие
}
}
console.log(getGreeting(10)); // Вывод: Доброе утро
console.log(getGreeting(14)); // Вывод: Добрый день
console.log(getGreeting(20)); // Вывод: Добрый вечер
function bankerRound(x) {
if (Math.round(x) % 2 == 0) return Math.round(x);
else {
if (x < Math.round(x)) return Math.round(x) - 1;
else return Math.round(x) + 1;
}
}
console.log(bankerRound(2.7)); // 2
console.log(bankerRound(3.2)); // 4
console.log(bankerRound(4.3)); // 4
<body>
<p id="Log"></p>
<p class="secondLog"></p>
<script src="app.js"></script>
</body>
function addIdLog(text) {
Log.innerHTML = `<br>${text}</br>`;
}
function addClassLog(text) {
secondLog.innerHTML = `<h2>${text}</h2>`;
}
В JavaScript есть важное различие между использованием id и class
Когда вы задаете элементу атрибут id
, браузер автоматически создает глобальную переменную
с именем, совпадающим с этим id
. В нашем случае, элемент с id="Log"
становится доступным через глобальную переменную Log
. Поэтому вызов Log.innerHTML
работает корректно.
Для элементов с классами (class
) такой глобальной переменной не создается. Чтобы получить доступ к элементу с классом secondLog, нужно использовать методы работы с DOM, такие как document.querySelector
или document.getElementsByClassName
.
Например:
function addClassLog(text) {
const secondLog = document.querySelector(".second_log"); // Находим элемент с классом
secondLog.innerHTML = `<h2>${text}</h2>`;
}
Объект arguments
представляет собой массивоподобную структуру, содержащую все аргументы, переданные функции. Основные задачи:
- Позволяет работать с переменным числом аргументов.
- Дает доступ к переданным значениям без явного указания параметров.
- Используется в старом коде, но в ES6+ предпочтительно использовать оператор
...rest
.
Пример использования arguments
:
function sum() {
let total = 0;
for (let i = 0; i < arguments.length; i++) {
total += arguments[i];
}
return total;
}
console.log(sum(1, 2, 3, 4)); // 10
arguments.length
возвращает количество аргументов, переданных в функцию.
function showArgs() {
document.getElementById(
"output"
).innerHTML = `Функция вызвана с ${arguments.length} аргументами`;
}
showArgs(1, 2, 3);
- В отличие от строгих языков, количество переданных аргументов может отличаться от числа объявленных параметров.
- Объект
arguments
доступен только внутри обычных функций (не стрелочных).
const arrowFunc = () => {
console.log(arguments); // Ошибка: arguments не определён
};
Область видимости (Scope) — это контекст, в котором переменные и функции доступны в коде. В JavaScript существуют три основные области видимости:
- Глобальная — переменные доступны во всем коде.
- Функциональная — переменные доступны только внутри функции.
- Блочная — переменные доступны только в пределах блока
{}
.
Глобальные переменные в JavaScript становятся свойствами window
(в браузере) или globalThis
(универсально).
var globalVar = "Hello";
document.getElementById("output").innerHTML = window.globalVar; // Hello
- Переменные, объявленные с
var
, поднимаются (hoisting). - Область видимости — функция.
- Может быть переопределена.
function exampleVar() {
if (true) {
var test = "Переменная var";
}
document.getElementById("output").innerHTML = test; // Доступна вне блока
}
exampleVar();
- Область видимости — блок
{}
. - Не поднимается.
- Можно переопределить.
function exampleLet() {
if (true) {
let test = "Переменная let";
document.getElementById("output").innerHTML = test;
}
// console.log(test); // Ошибка: test не определена вне блока
}
exampleLet();
- Область видимости — блок
{}
. - Не может быть изменена после инициализации.
- Используется для неизменяемых значений.
function exampleConst() {
const pi = 3.1415;
document.getElementById("output").innerHTML = pi;
}
exampleConst();
- Используйте
var
только если нужен функциональный scope (например, в старом коде). - Используйте
let
, если переменная должна изменяться. - Используйте
const
, если значение переменной не должно изменяться.
Поднятие (hoisting) — это механизм JavaScript, при котором объявления переменных и функций перемещаются в начало их области видимости перед выполнением кода. Однако только объявления поднимаются, но не их инициализация.
Переменная поднимается, но инициализируется значением undefined
:
console.log(a); // undefined
var a = 5;
console.log(a); // 5
Объявления let
и const
поднимаются, но не инициализируются, что приводит к ошибке, если попытаться обратиться к переменной до её объявления:
console.log(b); // Ошибка: Cannot access 'b' before initialization
let b = 10;
console.log(c); // Ошибка: Cannot access 'c' before initialization
const c = 20;
Функции, объявленные через function declaration
, поднимаются полностью:
hello(); // Работает
function hello() {
console.log("Привет!");
}
Но если использовать function expression
, то hoisting не работает:
sayHi(); // Ошибка: Cannot access 'sayHi' before initialization
var sayHi = function () {
console.log("Привет!");
};
console.log(num); // undefined
var num = 10;
console.log(num); // 10
console.log(value); // Ошибка: Cannot access 'value' before initialization
let value = 20;
Вывод: Используйте let
и const
вместо var
, чтобы избежать ошибок, связанных с hoisting. var
можно применять, если нужно объявление на уровне функции, но лучше избегать его использования в современном коде.
Рекурсия — это механизм, при котором функция вызывает саму себя.
Этот метод широко используется для реализации рекуррентных математических формул, где новые значения вычисляются на основе предыдущих.
Факториал числа n! — это произведение всех чисел от 1 до n: n!=(n−1)!×n Программная реализация через цикл:
function factorial(n) {
let result = 1;
for (let i = 2; i <= n; i++) {
result *= i;
}
return result;
}
Рекурсивный вариант:
function factorial(n) {
if (n == 1) return 1;
return n * factorial(n - 1);
}
Здесь базовый случай if(n==1) return 1;
предотвращает бесконечный вызов.
Рекурсия может заменить циклы, например, при выводе чисел от 1 до n:
function stringWithNumbers(n) {
if (n == 1) return "1";
return stringWithNumbers(n - 1) + ", " + n;
}
Модификация для обратного порядка:
function reverseNumbers(n) {
if (n == 1) return "1";
return n + ", " + reverseNumbers(n - 1);
}
Рекурсивный способ вычисления чисел Фибоначчи:
function Fibonacci(n) {
if (n < 3) return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
Здесь if (n < 3) return 1; задает начальные условия.
Авто-рекурсия (само-рекурсия)
– функция вызывает саму себя (пример: factorial(n)).Взаимная (косвенная) рекурсия
– одна функция вызывает другую, а та снова первую (пример: A() → B() → A()).
Рекурсия может быть мощнее циклов при работе с многопоточным исполнением и сложными структурами данных.
Объект — это некоторая конкретная реализация какой-то сущности. Например, у нас есть некоторая общая сущность "яблоко". Объектом будет конкретное яблоко, лежащее перед нами. Или, например, сущность "автомобиль": красный автомобиль марки AUDI, который мы видим перед собой в автосалоне, это объект.
В JavaScript объекты играют ключевую роль, предоставляя возможность хранить данные в виде пар "ключ-значение". Они могут рассматриваться как ассоциативные массивы или использоваться в объектно-ориентированном стиле программирования.
Объект в JavaScript можно создать несколькими способами. Рассмотрим два основных:
let obj = {};
let obj2 = new Object();
Первый способ предпочтителен, так как он более лаконичный и читаемый.
Для добавления свойств можно использовать два подхода:
let student = {};
student["Name"] = "Vasya";
student["Age"] = 23;
console.log(student["Name"]);
console.log(student["Age"]);
let firm = {};
firm.Name = "Star Inc";
firm.Address = "Somewhere street 5";
console.log(firm.Name);
console.log(firm.Address);
Точечная нотация удобнее, но если в ключе есть пробелы, ее использовать нельзя:
let dog = {};
dog["Name of dog"] = "Caesar";
console.log(dog["Name of dog"]);
Для удаления свойств используется оператор delete
:
let cat = {};
cat.Name = "Vasiliy";
cat["Age"] = 2;
delete cat.Name;
delete cat["Age"];
console.log(cat.Name); // undefined
console.log(cat.Age); // undefined
let obj = {};
obj.Name = "Oleg";
if ("Age" in obj) {
console.log("Exists");
} else {
console.log("Not exists");
}
Объект можно создавать сразу с набором свойств:
let student = {
name: "Dariana",
lastName: "Kislicova",
age: 23,
};
console.log(student.age);
Также можно вкладывать объекты друг в друга:
let student = {
name: "Dariana",
lastName: "Kislicova",
age: 23,
address: {
street: "Lenina 5",
city: "Moscow",
country: "Russia",
},
};
console.log(student.lastName);
console.log(student.address.street);
console.log(student.address.city);
Цикл for...in
используется для перебора всех свойств объекта. На каждой итерации переменная цикла получает имя свойства объекта.
Пример:
const rect = {
x: 0,
y: 0,
endX: 10,
endY: 10,
};
for (let key in rect) {
console.log(`Ключ: ${key}, Значение: ${rect[key]}`);
}
Как работает цикл for...in
:
- На первой итерации
key
будет равно "x", и выведется значениеrect["x"]
. - На второй итерации
key
будет "y", и выведетсяrect["y"]
. - Аналогично для "endX" и "endY".
Важно помнить, что for...in
перебирает все свойства объекта, включая унаследованные. Если объект содержит свойства, унаследованные от прототипа, они тоже будут перебираться. Для фильтрации используют Object.hasOwnProperty()
:
for (let key in rect) {
if (rect.hasOwnProperty(key)) {
console.log(`Ключ: ${key}, Значение: ${rect[key]}`);
}
}
Массив — это структура данных, которая позволяет хранить набор значений под одним именем. Каждый элемент массива имеет индекс, начиная с 0. В отличие от многих языков программирования, в JavaScript массив может содержать элементы разных типов.
Пример массива с разными типами данных:
let mixedArray = [42, "Hello", true, { name: "Alice" }, [1, 2, 3]];
console.log(mixedArray);
let arr1 = new Array(); // пустой массив
let arr2 = new Array(5); // массив с длиной 5
let arr3 = new Array("apple", "banana", "cherry");
console.log(arr3);
Этот метод не рекомендуется из-за двусмысленности (например, new Array(5)
создаст пустой массив длиной 5, а new Array(5, 10)
создаст массив с двумя числами).
let arr1 = []; // пустой массив
let arr2 = [10, 20, 30];
let fruits = ["apple", "banana", "cherry"];
console.log(fruits);
Этот способ удобнее и является предпочтительным.
Доступ к элементам массива осуществляется по индексу:
let numbers = [5, 10, 15];
console.log(numbers[0]); // 5
console.log(numbers[1]); // 10
console.log(numbers[2]); // 15
Можно изменять элементы массива:
numbers[1] = 99;
console.log(numbers); // [5, 99, 15]
Свойство length
показывает количество элементов в массиве:
let colors = ["red", "green", "blue"];
console.log(colors.length); // 3
Если изменить length
, массив уменьшится или увеличится:
colors.length = 2;
console.log(colors); // ["red", "green"]
colors.length = 5;
console.log(colors); // ["red", "green", empty × 3]
Перебрать массив можно с помощью цикла for
:
let numbers = [10, 20, 30, 40];
for (let i = 0; i < numbers.length; i++) {
console.log(numbers[i]);
}
Альтернативный способ — forEach
:
numbers.forEach(function (number) {
console.log(number);
});
Или с использованием стрелочной функции:
numbers.forEach((num) => console.log(num));
Перебор с помощью цикла for...of:
let numbers = [10, 20, 30, 40];
for (let num of numbers) {
console.log(num);
}
forEach()
тоже удобен для обхода массива, но он не поддерживает break
и continue
, а for...of
поддерживает.
Массивы могут содержать другие массивы:
let matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
];
console.log(matrix[0][1]); // 2
indexOf(value)
— возвращает индекс первого найденного элемента или-1
, если элемента нет.lastIndexOf(value)
— аналогично, но ищет с конца.includes(value)
— проверяет, есть ли элемент в массиве.
Пример:
let items = ["pen", "pencil", "notebook", "pen"];
console.log(items.indexOf("pen")); // 0
console.log(items.lastIndexOf("pen")); // 3
console.log(items.includes("pencil")); // true
push(value)
— добавляет элемент в конец.pop()
— удаляет последний элемент.unshift(value)
— добавляет элемент в начало.shift()
— удаляет первый элемент.
Пример:
let numbers = [1, 2, 3];
numbers.push(4);
console.log(numbers); // [1, 2, 3, 4]
numbers.pop();
console.log(numbers); // [1, 2, 3]
splice(index, count, ...items)
— удаляет или заменяет элементы.slice(start, end)
— возвращает копию части массива.
Пример:
let arr = ["a", "b", "c", "d"];
console.log(arr.slice(1, 3)); // ["b", "c"]
arr.splice(2, 1, "X");
console.log(arr); // ["a", "b", "X", "d"]
Метод .sort() в JavaScript сортирует элементы массива как строки по умолчанию. Это приводит к некорректным результатам при работе с числами. Например:
let numbers = [5, 12, 1, 45, 3];
console.log(numbers.sort());
// Ожидаем [1, 3, 5, 12, 45], но получаем [1, 12, 3, 45, 5]
Чтобы отсортировать числа правильно, нужно передать компараторную функцию:
let arr = [1, 3, 10, 5, 2, 1, 11, 20, 31];
console.log(arr);
function compareFunc(a, b) {
if (a > b) {
return 1;
} else if (b > a) {
return -1;
} else {
return 0;
}
}
arr.sort(compareFunc);
console.log(arr);
Второй способ записи компараторной функции:
let arr = [3, 4, 5, 1, 2, 3, 7, 8, 2, 3, 4, 5];
arr.sort((a, b) => a - b);
console.log(arr);
map(callback)
— создает новый массив, применяя функцию к каждому элементу.filter(callback)
— создает массив, оставляя только те элементы, для которых функция вернулаtrue
.reduce(callback, initialValue)
— вычисляет одно значение из массива.
Пример:
let numbers = [1, 2, 3, 4, 5];
let doubled = numbers.map((num) => num * 2);
console.log(doubled); // [2, 4, 6, 8, 10]
let evens = numbers.filter((num) => num % 2 === 0);
console.log(evens); // [2, 4]
let sum = numbers.reduce((acc, num) => acc + num, 0);
console.log(sum); // 15
- Создайте массив из 5 случайных чисел и выведите его в консоль.
- Напишите функцию, которая принимает массив чисел и возвращает новый массив с удвоенными значениями.
- Создайте многомерный массив (3x3) и выведите сумму всех его элементов.
- Напишите функцию, которая принимает массив строк и возвращает массив, содержащий только те строки, длина которых больше 3 символов.
- Напишите программу, которая проверяет, есть ли в массиве число 7.
Эта лекция поможет вам освоить массивы в JavaScript, научиться их создавать, изменять и обрабатывать с помощью встроенных методов!
В JavaScript строки являются основным типом данных, предназначенным для работы с текстовой информацией. В отличие от некоторых других языков, в JavaScript нет отдельного типа для символов, поэтому строка с одним символом - это все та же строка.
Строки можно записывать в одинарных (' '), двойных (" ") и шаблонных кавычках (` `). Использование шаблонных кавычек позволяет встраивать переменные и выражения прямо в строку. Рассмотрим примеры:
let str1 = "Привет, мир!";
let str2 = "JavaScript - это интересно!";
let name = "Андрей";
let str3 = `Привет, ${name}!`; // Используем шаблонные строки
console.log(str3); // Привет, Андрей!
JavaScript поддерживает специальные escape-последовательности:
\n
- перенос строки\t
- табуляция\\
- обратный слеш\"
и\'
- кавычки внутри строки
Пример использования:
let str = "Первая строка\nВторая строка";
console.log(str);
Доступ к символам осуществляется через индекс (начиная с 0):
let str = "JavaScript";
console.log(str[0]); // J
console.log(str[4]); // S
Строки в JavaScript неизменяемы. То есть, изменить отдельный символ строки нельзя, можно только создать новую строку:
let str = "Привет";
str[0] = "Х";
console.log(str); // Все равно "Привет"
Для объединения строк используется оператор +
или метод concat()
:
let first = "Hello";
let second = "World";
let result = first + " " + second;
console.log(result); // Hello World
let str = "JavaScript";
console.log(str.length); // 10
let str = "Hello";
console.log(str.charAt(1)); // e
console.log(str.charCodeAt(1)); // 101 (код символа 'e')
let str = "JavaScript";
console.log(str.toUpperCase()); // JAVASCRIPT
console.log(str.toLowerCase()); // javascript
let str = "apple, banana, cherry";
console.log(str.indexOf("banana")); // 7
console.log(str.indexOf("grape")); // -1 (не найдено)
let str = "Hello, World!";
console.log(str.substring(0, 5)); // Hello
console.log(str.substr(7, 5)); // World
let str1 = "яблоко";
let str2 = "банан";
console.log(str1.localeCompare(str2)); // 1 (яблоко > банан в алфавите)
let str = "Hello, world!";
console.log(str.includes("world")); // true
console.log(str.includes("World")); // false (регистр имеет значение)
let str = "JavaScript";
console.log(str.startsWith("Java")); // true
console.log(str.startsWith("Script")); // false
let str = "example.txt";
console.log(str.endsWith(".txt")); // true
console.log(str.endsWith("example")); // false
let str = " Hello, world! ";
console.log(str.trim()); // "Hello, world!"
console.log(str.trimStart()); // "Hello, world! "
console.log(str.trimEnd()); // " Hello, world!"
let str = "Ha!";
console.log(str.repeat(3)); // "Ha!Ha!Ha!"
let str = "I love JavaScript!";
console.log(str.replace("love", "like")); // "I like JavaScript!"
console.log("aaa".replaceAll("a", "b")); // "bbb"
let str = "apple,banana,orange";
console.log(str.split(",")); // ["apple", "banana", "orange"]
- Создайте строку, содержащую вашу фамилию и имя. Используйте шаблонные строки, чтобы вставить ее в другой текст.
- Напишите код, который заменяет все пробелы в строке на
-
. - Проверьте, содержится ли слово "JavaScript" в строке
"Изучаем JavaScript с нуля"
. - Извлеките подстроку из строки
"Frontend Development"
, содержащую слово "Frontend". - Напишите код, который считает количество вхождений буквы "а" в строке
"Мама мыла раму"
.
В JavaScript есть механизмы для выполнения кода через определенный промежуток времени. Например, в онлайн-играх можно отсчитывать время до окончания уровня, а на сайтах — обновлять данные без перезагрузки страницы. Для этого используются таймеры и интервалы.
Функция setTimeout
позволяет выполнить код или вызвать функцию через определенное время (в миллисекундах).
setTimeout(функция, задержка, аргумент1, аргумент2, ...);
- функция — вызываемая функция.
- задержка — время задержки в миллисекундах (1000 мс = 1 секунда).
- аргументы (необязательные) — передаются в вызываемую функцию.
function sayHello() {
alert("Hello, world!");
}
setTimeout(sayHello, 2000); // Выведет сообщение через 2 секунды
function sum(a, b) {
alert(a + b);
}
setTimeout(sum, 1500, 5, 10); // Через 1.5 секунды покажет 15
Таймер можно отменить с помощью clearTimeout
.
function showMessage() {
alert("Это сообщение не появится");
}
var timerId = setTimeout(showMessage, 3000);
clearTimeout(timerId); // Отмена вызова
Функция setInterval
выполняет код или вызывает функцию через равные промежутки времени.
setInterval(функция, интервал, аргумент1, аргумент2, ...);
- функция — вызываемая функция.
- интервал — промежуток времени между вызовами в миллисекундах.
- аргументы (необязательные) — передаются в вызываемую функцию.
function showTime() {
console.log("Прошла еще одна секунда");
}
setInterval(showTime, 1000); // Сообщение в консоли каждую секунду
var counter = 0;
function count() {
counter++;
console.log("Счетчик: " + counter);
}
var intervalId = setInterval(count, 1000);
Функцию можно остановить с помощью clearInterval
.
var count = 0;
function stopAfterThree() {
count++;
console.log("Вызов №" + count);
if (count === 3) {
clearInterval(intervalId);
}
}
var intervalId = setInterval(stopAfterThree, 2000); // Остановится после 3 раз
setTimeout
можно использовать для повторного вызова функции.
var counter = 0;
function repeatAction() {
counter++;
console.log("Вызов №" + counter);
if (counter < 3) {
setTimeout(repeatAction, 2000); // Вызывает саму себя
}
}
setTimeout(repeatAction, 2000);
Этот метод позволяет менять интервал между вызовами динамически.
var counter = 1;
function dynamicTimeout() {
console.log("Вызов №" + counter);
var nextDelay = counter * 2000;
counter++;
if (counter <= 3) {
setTimeout(dynamicTimeout, nextDelay);
}
}
setTimeout(dynamicTimeout, 2000);
- Напишите функцию, которая через 3 секунды выведет
"Время вышло!"
. - Создайте таймер, который выводит число от 1 до 5 с интервалом 1 секунда, а затем останавливается.
- Реализуйте аналог
setInterval
, используя рекурсивныйsetTimeout
.
При решении задач в программировании часто требуются математические вычисления. В JavaScript для этого предусмотрен встроенный объект Math
. Он содержит полезные свойства и методы для выполнения различных математических операций.
Рассмотрим некоторые константы объекта Math
:
- Math.PI – число Пи (≈ 3.14159);
- Math.E – число Эйлера (≈ 2.718);
- Math.SQRT2 – квадратный корень из 2 (≈ 1.414);
- Math.SQRT1_2 – квадратный корень из 1/2 (≈ 0.707).
Пример использования:
console.log(Math.PI); // 3.141592653589793
console.log(Math.E); // 2.718281828459045
- Math.ceil(x) – округляет
x
вверх; - Math.floor(x) – округляет
x
вниз; - Math.round(x) – округляет
x
по математическим правилам; - Math.trunc(x) – отбрасывает дробную часть.
Пример:
console.log(Math.ceil(4.3)); // 5
console.log(Math.floor(4.9)); // 4
console.log(Math.round(4.5)); // 5
console.log(Math.trunc(4.9)); // 4
- Math.pow(x, y) – возводит
x
в степеньy
; - Math.sqrt(x) – извлекает квадратный корень из
x
.
Пример:
console.log(Math.pow(2, 3)); // 8
console.log(Math.sqrt(16)); // 4
- Math.min(a, b, ...) – возвращает минимальное значение;
- Math.max(a, b, ...) – возвращает максимальное значение;
- Math.abs(x) – возвращает модуль числа
x
.
Пример:
console.log(Math.min(3, -5, 10, 0)); // -5
console.log(Math.max(3, -5, 10, 0)); // 10
console.log(Math.abs(-42)); // 42
Для генерации случайных чисел используется метод Math.random(). Он возвращает число в диапазоне от 0 (включительно) до 1 (не включительно).
Примеры:
console.log(Math.random()); // случайное число от 0 до 1
Как получить случайное число в другом диапазоне:
- от 0 до N:
Math.floor(Math.random() * (N + 1))
; - от A до B:
Math.floor(Math.random() * (B - A + 1)) + A
.
Примеры:
console.log(Math.floor(Math.random() * 10)); // число от 0 до 9
console.log(Math.floor(Math.random() * 11)); // число от 0 до 10
console.log(Math.floor(Math.random() * (50 - 20 + 1)) + 20); // число от 20 до 50
- Выведите в консоль значения
Math.PI
,Math.E
,Math.SQRT2
. - Напишите программу, которая принимает число и округляет его:
- вверх (
Math.ceil
); - вниз (
Math.floor
); - по правилам математики (
Math.round
).
- вверх (
- Напишите функцию, которая принимает два числа и возвращает большее из них.
- Напишите программу, которая генерирует случайное число от 1 до 100.
- Создайте калькулятор, который запрашивает у пользователя число и выводит его квадратный корень.
Объект Date
в JavaScript используется для работы с датой и временем. С его помощью можно получать текущую дату, манипулировать прошлым или будущим временем, а также выполнять вычисления с датами.
Текущая дата и время:
const today = new Date();
console.log(today);
Мгновенный таймштамп:
console.log(Date.now()); // количество миллисекунд с 1 января 1970
Создание даты из строки:
let date1 = new Date("2021-05-17");
let date2 = new Date("06/25/2021");
let date3 = new Date("November 2, 1999 13:25:00");
let date4 = new Date("1999-11-02T13:25:00");
let date5 = new Date("02 November 1999 13:25:00");
Создание даты из чисел:
const date6 = new Date(2022, 0, 12, 3, 45, 12, 500);
Важно: месяц указывается от 0 (январь) до 11 (декабрь).
Дата из количества миллисекунд:
const date7 = new Date(1728357351109);
console.log(date2 - date1); // миллисекунды
console.log(Math.round((date2 - date1) / 1000 / 60 / 60 / 24)); // дни
Альтернативный способ:
console.log(Date.parse("11/08/2025"));
let today = new Date();
let yesterday = new Date(today - 24 * 60 * 60 * 1000);
let tomorrow = new Date(today.getTime() + 24 * 60 * 60 * 1000);
getFullYear()
— годgetMonth()
— месяц (0-11)getDate()
— день месяца (1-31)getDay()
— день недели (0-воскресенье до 6-суббота)getHours()
,getMinutes()
,getSeconds()
,getMilliseconds()
Пример:
let userBirthday = prompt("Enter your birthday (YYYY-MM-DD):", "2002-08-14");
let birthday = new Date(userBirthday);
let days = [
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
];
alert("You were born on " + days[birthday.getDay()]);
setFullYear(year[, month, day])
: Год, с возможностью задать месяц и день
let d = new Date();
d.setFullYear(2020);
console.log(d); // Год станет 2020
d.setFullYear(2021, 0, 15);
console.log(d); // 15 января 2021
setMonth(month[, day])
: Месяц, с возможностью задать день
let d = new Date();
d.setMonth(6); // Июль
console.log(d); // Месяц будет июль (текущий день сохранится)
d.setMonth(11, 25);
console.log(d); // 25 декабря
setDate(day)
: День месяца
let d = new Date();
d.setDate(10);
console.log(d); // 10-е число текущего месяца и года
d.setDate(40);
console.log(d); // Перепрыгнет на следующий месяц (9 февраля, например)
setHours(hours[, minutes, seconds, ms])
: Часы, с возможностью задать минуты и секунды
let d = new Date();
d.setHours(15);
console.log(d); // Установлено 15:00:00
d.setHours(10, 30, 45, 500);
console.log(d); // 10:30:45.500
setMinutes()
,setSeconds()
,setMilliseconds()
: Минуты, Секунды, Миллисекунды
let d = new Date();
d.setMinutes(45);
d.setSeconds(20);
d.setMilliseconds(300);
console.log(d); // Например: 12:45:20.300
setTime(ms)
— миллисекунды с 01.01.1970: Устанавливает абсолютное время с 1970 года
let d = new Date();
d.setTime(0);
console.log(d); // Thu Jan 01 1970 03:00:00 GMT+0300 (в зависимости от часового пояса)
let now = new Date();
let timestamp = now.getTime();
let newDate = new Date();
newDate.setTime(timestamp + 86400000); // +1 день
console.log(newDate); // Завтрашняя дата
JavaScript использует две временные зоны:
- Local Time — часовой пояс пользователя
- UTC (GMT+0) — всемирное координированное время
UTC-методы:
getUTCFullYear()
,getUTCMonth()
,getUTCDay()
и т.п.
toLocaleString()
— дата и времяtoLocaleDateString()
— только датаtoLocaleTimeString()
— только время
Пример:
let date = new Date();
console.log(date.toLocaleString());
console.log(date.toLocaleDateString());
console.log(date.toLocaleTimeString());
let d = new Date("02/07/2022");
let month = d.getMonth();
let weekDay = d.getDay();
for (let i = 0; i < 12; i++) {
if (i === month) continue;
d.setMonth(i);
if (d.getDay() === weekDay) {
console.log(d.toLocaleDateString());
}
}
- Создайте переменную
now
, в которую запишите текущую дату и время. Выведите её в консоль. - Выведите количество миллисекунд, прошедших с 1 января 1970 года.
- Создайте переменную
customDate
, в которую передайте дату вашего рождения (форматГГГГ-ММ-ДД
). Выведите день недели, на который оно пришлось. - Найдите разницу в днях между двумя датами:
2022-10-10
и2023-02-15
. - Создайте переменные
yesterday
иtomorrow
, основываясь на текущей дате. Выведите обе даты в консоль в локальном формате. - Составьте функцию, которая на вход принимает строку-дату и возвращает строку: "Вы родились в [день недели]".
- Составьте цикл, который проверяет, в каких месяцах 2024 года 1-е число приходится на воскресенье, и выведите их в консоль.
Объектно-ориентированное программирование подразумевает, что вы создаете некий шаблон объекта, в котором описываете его свойства (некие переменные, или ключи объекта) и методы взаимодействия с этим объектом (функции), как бы моделируя в коде поведение реальных объектов. То есть этот шаблон или фабрика по созданию объектов одного типа работает с кодом примерно так же, как реальная фабрика штампует, например, однотипные фломастеры разных цветов или выпускает намного более сложные по своей конструкции автомобили.
При объектно-ориентированном подходе в программировании каждый объект должен представлять собой интуитивно понятную сущность, у которой есть методы и свойства, четко описывающие данный объект.
Когда рассматривают ООП в различных языках программирования, то обычно говорят о создании объектов на основе классов. С 2015 года (стандарт ES6, или EcmaScript2015) классы появились и в JavaScript, хотя и до этого времени в нем можно было создавать объекты, которые наследовали свойства от некого основного объекта-прототипа. И даже с появлением классов этот механизм не слишком-то изменился. То есть в JavaScript ООП основано на прототипах. Теперь необходимо разобраться, что же такое прототип.
Прототип — это объект, который содержит данные о свойствах и методах всех объектов одного типа. Кроме того, все объекты являются наследниками класса Object, описанного в ядре JS. С помощью этого класса вы создавали литерал объекта. То есть можно сказать, что прототипом любого объекта в JS является класс Object.
Если сравнивать структуру взаимосвязи объектов, построенную на основе прототипов, с реальной семьей, то можно сказать, что в основе каждого рода (семьи) находятся 2 человека, которые определяют черты (свойства или характеристики) будущих поколений и варианты их поведения или работы. Например, в семье людей с темными волосами и карими глазами будут рождаться дети (создаваться объекты) с такими же характеристиками, хотя цвет волос можно изменить (назначить свойству новое значение). Кроме того, в одной семье могут рождаться дети с музыкальными способностями или дети, которые впоследствии станут ювелирами или сапожниками, или бизнесменами, потому что в их роду такую профессию или сферу деятельности выбирали все. С точки зрения JavaScript сфера деятельности — это уже метод, или функция, причем она наследуется всеми объектами с одним прототипом автоматически, как и музыкальные способности в семье.
Прототипы в JS — это возможность «передать по наследству» всем объектам одного типа некие характеристики, причем таким образом, чтобы каждый из объектов мог воспользоваться этими характеристиками в определенной ситуации.
Пример такой ситуации — это использование методов массива. Например, у нас есть 2 группы студентов, представленные в виде массивов. Нам нужно перевести 2-х студентов из одной группы в другую. Сделаем это с помощью методов массивов splice() и concat():
let group1 = ['Deniels', 'Jonhson', 'Overton', 'Stufford', 'Templeton'],
group2 = ['Greenwood','Liner','Takerman'];
let students = group1.splice(2, 2);
console.log(students);
group2 = group2.concat(students);
console.log(group1, group2);
Результатом наших действий будут 3 массива в консоли: первый со студентами, «удаленными» методом splice() из group1, а два других — новые массивы group1 и group2. Интересует нас сейчас больше тот факт, что прототипом каждого из массивов является объект Array с набором методов, доступных каждому массиву (т.е. объекту типа Array), но при этом для каждого из наших массивов мы использовали только тот метод, который нужен был нам, исходя из условий поставленной задачи.
А это значит, что прототип Array может хранить некое количество информации, реализованной в виде функций, но используемых по мере необходимости.
Вернусь к аналогии с семьей и музыкальными способностями. Кто-то в такой семье может играть на рояле профессионально или для себя, или петь (метод используется), кто-то ни за что не подойдет к инструменту. Однако дети этих людей могут опять-таки использовать свои музыкальные способности или никогда о них не вспоминать, но способности при этом никуда из семьи не денутся.
Так и в JavaScript — методы, реализованные в прототипе, автоматически наследуются, т.е. передаются объекту такого типа, причем вне зависимости от того, будет ли объект эти методы использовать.
Теперь перейдем к вопросу о том, как лучше создавать объекты одного типа (или с одним прототипом) в JavaScript. Так вот для того чтобы создать основу для прототипирования объекта в JavaScript, обычно используют функции-конструкторы или классы.
Функции-конструкторы используются для создания множества однотипных объектов с одинаковыми свойствами и методами.
Пример: создание объекта без конструктора:
let student = {
firstname: 'John',
lastname: 'Doe',
birthday: '01/01/2000',
showInfo: function(){
console.log(this.firstname + ' ' + this.lastname);
}
};
student.showInfo();
Функции-конструкторы называются с заглавной буквы, а данные передаются через параметры. Свойства объекта создаются через this
.
Пример: функция-конструктор для создания объектов Student:
function Student(firstname, lastname, birthday) {
this.firstname = firstname;
this.lastname = lastname;
this.birthday = birthday;
this.showInfo = function() {
console.log('Student: ' + this.firstname + ' ' + this.lastname);
};
}
let student1 = new Student('Jane', 'Doe', '02/02/1995');
student1.showInfo();
Функции-конструкторы возвращают объект с помощью new
, без явного использования return
.
Пример: создание объекта без return:
function Hotel(name, rooms, bookedRooms) {
this.name = name;
this.rooms = rooms;
this.bookedRooms = bookedRooms;
this.availableRooms = function() {
return this.rooms - this.bookedRooms;
};
}
let hotel = new Hotel('Grand Palace', 100, 50);
console.log(hotel.availableRooms());
В функциях-конструкторах оператор this
ссылается на объект, который создается при вызове функции с использованием оператора new
. То есть, this
позволяет назначать значения свойств этому только что созданному объекту.
Когда мы создаем новый объект с помощью функции-конструктора, this
внутри функции ссылается именно на этот новый объект. Это позволяет нам добавлять свойства и методы к этому объекту.
function Person(name, age) {
this.name = name; // Свойство name будет добавлено к объекту
this.age = age; // Свойство age будет добавлено к объекту
this.sayHello = function() { // Метод, который будет доступен у объекта
console.log(`Привет, меня зовут ${this.name} и мне ${this.age} лет.`);
};
}
let person1 = new Person('Иван', 25);
let person2 = new Person('Мария', 30);
person1.sayHello(); // Привет, меня зовут Иван и мне 25 лет.
person2.sayHello(); // Привет, меня зовут Мария и мне 30 лет.
-
При создании нового объекта
person1
илиperson2
с помощью функции-конструктора Person,this
в функции ссылается на этот конкретный объект. -
Свойства name и age, а также метод sayHello привязываются к этому объекту, и могут быть использованы для каждого объекта, созданного через new Person().
-
this
всегда ссылается на объект, создаваемый при вызове функции-конструктора. -
Если мы не используем оператор
new
, тоthis
будет ссылаться на глобальный объект (например, window в браузере).
В JavaScript
, когда мы создаём объект через функцию-конструктор, этот объект автоматически получает доступ к прототипу конструктора. Прототип — это специальный объект, к которому привязываются все методы и свойства, общие для всех объектов, созданных через данный конструктор. Каждый объект, созданный с помощью конструктора, может наследовать свойства и методы, определённые в прототипе конструктора.
- Прототип — это скрытый объект, к которому можно добавить методы или свойства.
- Все объекты, созданные с помощью функции-конструктора, имеют ссылку на свой прототип.
- Если метод или свойство не найдено в объекте, JavaScript будет искать его в прототипе.
Добавление методов в прототип полезно, когда мы хотим, чтобы все экземпляры объекта имели доступ к этим методам, а не только конкретные объекты.
Предположим, у нас есть конструктор, создающий объект Book (книга). Мы хотим добавить новый метод isOld(), который будет проверять, является ли книга старой (более 50 лет).
Код с использованием прототипа:
function Book(title, author, year) {
this.title = title;
this.author = author;
this.year = year;
}
// Добавляем метод isOld() в прототип конструктора Book
Book.prototype.isOld = function() {
return new Date().getFullYear() - this.year > 50;
};
// Создаём новый объект
let book1 = new Book('1984', 'George Orwell', 1949);
let book2 = new Book('JavaScript: The Good Parts', 'Douglas Crockford', 2008);
// Проверяем, является ли книга старой
console.log(book1.isOld()); // true, книга старше 50 лет
console.log(book2.isOld()); // false, книга младше 50 лет
- Мы создаём конструктор Book, который принимает параметры
title
,author
иyear
. - Метод
isOld()
добавляется в прототип конструктора Book с помощью Book.prototype.isOld
. Теперь все объекты, созданные с помощью new Book(), могут использовать этот метод. - Метод
isOld()
проверяет, старше ли книга 50 лет, сравнивая текущий год с годом издания книги.
- Оптимизация памяти: Методы, добавленные в прототип, не создаются заново для каждого экземпляра объекта. Все экземпляры делят один и тот же метод, что экономит память.
- Наследование: Прототипы позволяют объектам наследовать свойства и методы друг от друга, что способствует созданию более гибких и удобных иерархий.
- Когда мы вызываем метод book1.isOld(), JavaScript сначала ищет этот метод в объекте book1. Если его там нет, поиск продолжается в прототипе, где и находится метод isOld.
-
Создайте объект студента с произвольными свойствами (имя, возраст, курс) и методом, который выводит информацию о студенте.
-
Используя прототип, добавьте всем объектам студентов метод, который возвращает их статус (например, "Студент первого курса").
-
Создайте два массива и с помощью методов массива splice() и concat() переместите элементы из одного массива в другой.
-
Создайте функцию-конструктор
Car
, которая будет иметь свойстваbrand
,model
,year
, а также методыgetInfo()
иgetAge()
. -
Создайте 3 объекта с помощью функции
Car
и вызовите их методы. -
Добавьте в
Car
методisOld()
, который возвращаетtrue
, если автомобилю больше 10 лет. -
Создайте функцию-конструктор
Book
со свойствамиtitle
,author
,year
,pages
. Добавьте методgetShortDescription()
. -
Создайте массив из объектов Book и выведите краткую информацию о каждой книге.
-
В функции-конструкторе
Hotel
добавьте методbookRoom()
, который увеличивает число забронированных номеров на 1.