Читать книгу JavaScript: От Основ до Full-Stack Разработки (Александр Ольшевски) онлайн бесплатно на Bookz (4-ая страница книги)
bannerbanner
JavaScript: От Основ до Full-Stack Разработки
JavaScript: От Основ до Full-Stack Разработки
Оценить:

4

Полная версия:

JavaScript: От Основ до Full-Stack Разработки

console.log(colors); // Выведет: ["красный", "желтый", "синий"]

Добавление и удаление элементов (основные методы):

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

push(element): Добавляет один или несколько элементов в конец массива. Возвращает новую длину массива.javascriptlet numbers = [1, 2];

numbers.push(3); // numbers теперь: [1, 2, 3]

numbers.push(4, 5); // numbers теперь: [1, 2, 3, 4, 5]

let newLength = numbers.push(6);

console.log(numbers); // [1, 2, 3, 4, 5, 6]

console.log(newLength); // 6

pop(): Удаляет последний элемент из массива и возвращает его.javascriptlet fruits = ["яблоко", "банан", "апельсин"];

let lastFruit = fruits.pop();

console.log(fruits); // ["яблоко", "банан"]

console.log(lastFruit); // "апельсин"

unshift(element): Добавляет один или несколько элементов в начало массива. Возвращает новую длину массива.javascriptlet numbers = [2, 3];

numbers.unshift(1); // numbers теперь: [1, 2, 3]

numbers.unshift(0, -1); // numbers теперь: [-1, 0, 1, 2, 3]

let newLength = numbers.unshift(-2);

console.log(numbers); // [-2, -1, 0, 1, 2, 3]

console.log(newLength); // 6

shift(): Удаляет первый элемент из массива и возвращает его.javascriptlet fruits = ["яблоко", "банан", "апельсин"];

let firstFruit = fruits.shift();

console.log(fruits); // ["банан", "апельсин"]

console.log(firstFruit); // "яблоко"

Методы для работы с частью массива:

splice(startIndex, deleteCount, item1, item2, …): Очень мощный метод, который может удалять, добавлять или заменять элементы в массиве.startIndex: Индекс, с которого начинать изменения.

deleteCount: Количество элементов для удаления (0 – если нужно только добавить).

item1, item2, …: Элементы для добавления (если они есть).

Возвращает массив удаленных элементов (если они были).

javascriptlet numbers = [1, 2, 3, 4, 5];

// Удалить 2 элемента, начиная с индекса 2

let removed = numbers.splice(2, 2);

console.log(numbers); // [1, 2, 5] (удалены 3 и 4)

console.log(removed); // [3, 4]

// Вставить элементы, не удаляя ничего, начиная с индекса 1

numbers.splice(1, 0, "a", "b");

console.log(numbers); // [1, "a", "b", 2, 5]

// Заменить 1 элемент, начиная с индекса 3, на новый элемент

numbers.splice(3, 1, "X");

console.log(numbers); // [1, "a", "b", "X", 5]

slice(startIndex, endIndex): Создает новый массив, содержащий копию части исходного массива. Не изменяет исходный массив.startIndex: Индекс, с которого начинать копирование.

endIndex (необязательный): Индекс, ДО которого включать элементы. Если не указан, копирует до конца массива.

javascriptlet letters = ["a", "b", "c", "d", "e"];

// Скопировать элементы с индекса 1 до индекса 4 (не включая 4)

let subset1 = letters.slice(1, 4);

console.log(subset1); // ["b", "c", "d"]

console.log(letters); // ["a", "b", "c", "d", "e"] (исходный массив не изменился)

// Скопировать элементы с индекса 2 до конца

let subset2 = letters.slice(2);

console.log(subset2); // ["c", "d", "e"]

// Использование отрицательных индексов (отсчет с конца)

let lastTwo = letters.slice(-2); // Два последних элемента

console.log(lastTwo); // ["d", "e"]

Другие полезные методы массивов:

concat(array1, array2, …): Объединяет два или более массивов в новый массив.javascriptlet arr1 = [1, 2];

let arr2 = [3, 4];

let combined = arr1.concat(arr2, [5, 6]);

console.log(combined); // [1, 2, 3, 4, 5, 6]

console.log(arr1); // [1, 2] (исходный массив не изменился)

Синтаксис с spread-оператором (…) (let combined = […arr1, …arr2];) часто предпочтительнее для объединения массивов, так как он более современный и гибкий.

join(separator): Объединяет все элементы массива в одну строку, используя указанный separator. Если separator не указан, используется запятая.javascriptlet words = ["Hello", "world", "!"];

let sentence = words.join(" "); // Объединяем через пробел

console.log(sentence); // "Hello world !"

let numbersString = [1, 2, 3].join("-");

console.log(numbersString); // "1-2-3"

includes(element): Проверяет, есть ли элемент в массиве. Возвращает true или false.javascriptlet numbers = [1, 2, 3, 4];

console.log(numbers.includes(3)); // true

console.log(numbers.includes(5)); // false

indexOf(element): Возвращает индекс первого вхождения элемента в массив. Если элемент не найден, возвращает -1.javascriptlet fruits = ["apple", "banana", "apple", "orange"];

console.log(fruits.indexOf("banana")); // 1

console.log(fruits.indexOf("apple")); // 0 (индекс первого вхождения)

console.log(fruits.indexOf("grape")); // -1

reverse(): Инвертирует порядок элементов в массиве на месте (изменяет исходный массив) и возвращает ссылку на измененный массив.javascriptlet letters = ["a", "b", "c"];

letters.reverse();

console.log(letters); // ["c", "b", "a"]

Итерация по массивам (уже видели for…of, но есть и другие способы):

С помощью for цикла:javascriptlet animals = ["cat", "dog", "elephant"];

for (let i = 0; i < animals.length; i++) {

console.log(`Animal at index ${i}: ${animals[i]}`);

}

forEach(callbackFunction): Выполняет функцию callbackFunction один раз для каждого элемента массива. callbackFunction получает три аргумента: element, index, array.javascriptlet fruits = ["apple", "banana", "cherry"];

fruits.forEach(function(fruit, index, arr) {

console.log(`Fruit at index ${index}: ${fruit}`);

// console.log(arr); // Можно получить доступ к самому массиву

});

// С использованием стрелочной функции:

fruits.forEach((fruit, index) => {

console.log(`Fruit #${index + 1}: ${fruit}`);

});

6.2. Объекты (Objects): Хранение данных в формате “ключ-значение”

Термин: Объект (Object) – это неупорядоченная коллекция свойств. Каждое свойство состоит из ключа (key) и значения (value), которые связаны парой двоеточия :. Ключи обычно являются строками (или символами), а значения могут быть любого типа данных (включая другие объекты или массивы).

Объекты используются для моделирования сущностей реального мира (например, человек, автомобиль, книга) или для группировки связанных данных.

Создание объекта:

Объекты создаются с помощью фигурных скобок {}.

javascript

// Пустой объект

let emptyObject = {};

// Объект "человек"

let person = {

name: "Алиса", // Свойство: ключ "name", значение "Алиса"

age: 30, // Свойство: ключ "age", значение 30

isStudent: false, // Свойство: ключ "isStudent", значение false

city: "Москва", // Свойство: ключ "city", значение "Москва"

hobbies: ["чтение", "путешествия"] // Свойство: значение – массив

};

// Объект "автомобиль"

let car = {

brand: "Toyota",

model: "Camry",

year: 2022,

// Свойство, значение которого – другой объект

engine: {

type: "Petrol",

volume: 2.5

},

// Свойство, значение которого – функция (метод объекта)

start: function() {

console.log("Двигатель запущен!");

}

};

Доступ к свойствам объекта:

Есть два основных способа:

Точечная нотация (Dot Notation): объект.ключ (наиболее распространенный и предпочтительный способ).javascriptconsole.log(person.name); // Выведет: Алиса

console.log(person.age); // Выведет: 30

console.log(car.brand); // Выведет: Toyota

console.log(car.engine.type); // Доступ к свойству вложенного объекта. Выведет: Petrol

Скобочная нотация (Bracket Notation): объект[ключ] (обязательна, если ключ – переменная или содержит специальные символы/пробелы).javascriptconsole.log(person["name"]); // Выведет: Алиса

console.log(person["city"]); // Выведет: Москва

// Пример, когда скобочная нотация обязательна:

let propertyName = "age";

console.log(person[propertyName]); // Работает! Получим 30.

// person.propertyName выдало бы ошибку или undefined,

// так как искалось бы свойство с ключом "propertyName".

// Если ключ содержит пробелы или спецсимволы, скобочная нотация необходима:

let anotherPerson = {

"first name": "Иван",

"last-name": "Петров"

};

console.log(anotherPerson["first name"]); // "Иван"

// console.log(anotherPerson.first name); // Ошибка!

Изменение и добавление свойств:

Свойства объекта можно изменять или добавлять новые, используя точечную или скобочную нотацию.

javascript

let user = { name: "Петр" };

// Изменение свойства

user.name = "Петр Иванов";

console.log(user.name); // Петр Иванов

// Добавление нового свойства

user.age = 25;

user["isAdmin"] = false; // Добавление через скобочную нотацию

console.log(user); // { name: "Петр Иванов", age: 25, isAdmin: false }

Удаление свойств:

Используется оператор delete.

javascript

let product = { id: 1, name: "Ноутбук", price: 1000 };

delete product.price;

console.log(product); // { id: 1, name: "Ноутбук" }

Методы объектов (функции внутри объектов):

Функции, которые являются свойствами объекта, называются методами.

javascript

let calculator = {

a: 10,

b: 5,

add: function() { // Метод add

return this.a + this.b; // this ссылается на объект calculator

},

subtract: function() { // Метод subtract

return this.a – this.b;

}

};

console.log(calculator.add()); // Выведет: 15

console.log(calculator.subtract()); // Выведет: 5

// Можно вызывать методы объекта:

calculator.result = calculator.add();

console.log(calculator.result); // 15

Термин: this – контекст выполнения. В методах объекта this обычно ссылается на сам объект, который вызывает этот метод. Понимание this – одна из ключевых (и иногда непростых) тем в JavaScript.

Перебор свойств объекта:

for…in цикл: Как мы уже видели, перебирает ключи объекта.javascriptlet book = {

title: "Война и мир",

author: "Лев Толстой",

year: 1869

};

for (let key in book) {

console.log(`${key}: ${book[key]}`);

}

// Вывод:

// title: Война и мир

// author: Лев Толстой

// year: 1869

Object.keys(obj): Возвращает массив ключей объекта. Далее можно использовать forEach или for…of.javascriptlet car = { brand: "BMW", model: "X5", year: 2023 };

let carKeys = Object.keys(car); // ["brand", "model", "year"]

console.log(carKeys);

carKeys.forEach(key => {

console.log(`${key}: ${car[key]}`);

});

Object.values(obj): Возвращает массив значений объекта.javascriptlet car = { brand: "BMW", model: "X5", year: 2023 };

let carValues = Object.values(car); // ["BMW", "X5", 2023]

console.log(carValues);

carValues.forEach(value => {

console.log(value);

});

Object.entries(obj): Возвращает массив пар [ключ, значение].javascriptlet car = { brand: "BMW", model: "X5", year: 2023 };

let carEntries = Object.entries(car);

// carEntries будет: [ ["brand", "BMW"], ["model", "X5"], ["year", 2023] ]

console.log(carEntries);

carEntries.forEach(entry => {

let key = entry[0];

let value = entry[1];

console.log(`${key}: ${value}`);

});

// С деструктуризацией (очень удобно!):

carEntries.forEach(([key, value]) => {

console.log(`${key} –> ${value}`);

});

6.3. Объект Math

Термин: Объект Math – это встроенный объект JavaScript, содержащий математические константы и функции для выполнения базовых и сложных математических вычислений. Его свойства и методы доступны напрямую, без необходимости его создавать.

Популярные свойства:

Math.PI: Число Пи (≈ 3.14159)

Math.E: Основание натурального логарифма (≈ 2.71828)

Популярные методы:

Math.round(x): Округляет число x до ближайшего целого.javascriptconsole.log(Math.round(4.7)); // 5

console.log(Math.round(4.4)); // 4

console.log(Math.round(4.5)); // 5

Math.floor(x): Округляет число x вниз до ближайшего целого.javascriptconsole.log(Math.floor(4.7)); // 4

console.log(Math.floor(4.4)); // 4

console.log(Math.floor(-4.4)); // -5 (округляет вниз, т.е. к меньшему числу)

Math.ceil(x): Округляет число x вверх до ближайшего целого.javascriptconsole.log(Math.ceil(4.7)); // 5

console.log(Math.ceil(4.4)); // 5

console.log(Math.ceil(-4.4)); // -4 (округляет вверх, т.е. к большему числу)

Math.abs(x): Возвращает абсолютное значение (модуль) числа x.javascriptconsole.log(Math.abs(-10)); // 10

console.log(Math.abs(10)); // 10

Math.sqrt(x): Возвращает квадратный корень из x.javascriptconsole.log(Math.sqrt(9)); // 3

console.log(Math.sqrt(2)); // 1.4142135623730951

Math.pow(base, exponent): Возвращает base в степени exponent.javascriptconsole.log(Math.pow(2, 3)); // 8 (2 в кубе)

console.log(Math.pow(5, 2)); // 25 (5 в квадрате)

Math.random(): Возвращает псевдослучайное число с плавающей точкой между 0 (включительно) и 1 (не включительно).javascriptconsole.log(Math.random()); // Например: 0.123456789…

console.log(Math.random()); // Другое случайное число

Генерация случайного целого числа в диапазоне: Часто нужно получить случайное целое число, например, от 0 до 9.javascript// Случайное целое от 0 до 9 (включительно)

let min = 0;

let max = 9;

let randomInt = Math.floor(Math.random() * (max – min + 1)) + min;

console.log(randomInt); // Будет число от 0 до 9

Math.random() * (max – min + 1): Создает случайное число от 0 до max – min + 1 (не включая верхнюю границу).

Math.floor(…): Округляет вниз, чтобы получить целое число.

+ min: Сдвигает диапазон, чтобы он начинался с min.

6.4. Объект Date

Термин: Объект Date – это встроенный объект JavaScript, который используется для работы с датами и временем. Он позволяет создавать, получать и устанавливать компоненты даты и времени (год, месяц, день, час, минута, секунда).

Создание объекта Date:

Без аргументов: Создает объект Date с текущей датой и временем.javascriptlet now = new Date();

console.log(now); // Выведет текущую дату и время в формате, зависящем от локали

С указанием даты и времени: Аргументы можно передавать в разном формате, но самый надежный – это комбинация числовых значений.javascript// new Date(год, месяц, день, час, минута, секунда, миллисекунда)

// Месяцы нумеруются с 0 (январь) до 11 (декабрь)!

let specificDate = new Date(2023, 10, 21, 14, 30, 0, 0); // 21 Ноября 2023, 14:30:00

console.log(specificDate); // Выведет: Tue Nov 21 2023 14:30:00 GMT+0000 (Coordinated Universal Time) – формат может отличаться

Важно: Месяцы в Date нумеруются с 0 (январь) по 11 (декабрь). Это частый источник ошибок.

С указанием строки: Можно передать строку, но формат строки может интерпретироваться по-разному разными браузерами, поэтому этот способ менее надежен.javascriptlet dateFromString = new Date("2023-11-21T14:30:00"); // ISO 8601 формат, более надежный

console.log(dateFromString);

Получение компонентов даты и времени:

Объект Date имеет множество методов для получения отдельных частей даты/времени:

getFullYear(): Возвращает год (4 цифры).

getMonth(): Возвращает месяц (0-11). Помните про 0-индексацию!

getDate(): Возвращает день месяца (1-31).

getDay(): Возвращает день недели (0 – воскресенье, 1 – понедельник, …, 6 – суббота).

getHours(): Возвращает час (0-23).

getMinutes(): Возвращает минуты (0-59).

getSeconds(): Возвращает секунды (0-59).

getTime(): Возвращает количество миллисекунд, прошедших с 1 января 1970 года (Unix Timestamp). Полезно для сравнения дат или измерения интервалов.

javascript

let myDate = new Date(2024, 0, 15, 10, 0, 0); // 15 Января 2024, 10:00:00

console.log("Год:", myDate.getFullYear()); // 2024

console.log("Месяц:", myDate.getMonth()); // 0 (Январь)

console.log("День месяца:", myDate.getDate()); // 15

console.log("День недели:", myDate.getDay()); // 1 (Понедельник)

console.log("Час:", myDate.getHours()); // 10

console.log("Минуты:", myDate.getMinutes()); // 0

console.log("Секунды:", myDate.getSeconds()); // 0

console.log("Timestamp:", myDate.getTime()); // Большое число миллисекунд

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

Также есть методы для установки значений:

setFullYear(year)

setMonth(month)

setDate(date)

setHours(hours, minutes, seconds, ms) (можно установить все сразу)

setTime(milliseconds)

javascript

let today = new Date();

today.setFullYear(2025);

today.setMonth(0); // Устанавливаем январь

today.setDate(1);

console.log(today); // Дата станет 1 Января 2025 года

Сравнение дат:

Даты можно сравнивать, используя обычные операторы сравнения (<, >, <=, >=). Сравнение происходит по их значению в миллисекундах (getTime()).

javascript

let date1 = new Date(2024, 0, 15);

let date2 = new Date(2024, 0, 16);

if (date1 < date2) {

console.log("date1 раньше date2"); // Выполнится

}

Практическое задание:

Создайте массив studentScores с несколькими числами (оценками).Добавьте новую оценку в конец массива с помощью push().

Удалите последнюю оценку с помощью pop() и сохраните ее в переменной droppedScore.

Добавьте оценку 100 в начало массива с помощью unshift().

Удалите первую оценку с помощью shift() и сохраните ее.

Используйте splice(), чтобы заменить оценку с индексом 2 на 95.

Используйте slice(), чтобы создать новый массив topScores из двух лучших оценок (предполагая, что они в конце массива).

Используйте includes(), чтобы проверить, есть ли в studentScores оценка 70.

Используйте indexOf() для поиска первой оценки 80.

Используйте join() для преобразования массива studentScores в строку с разделителем “-“.

Переберите массив studentScores с помощью forEach() и выведите каждую оценку.

Создайте объект bookInfo со свойствами title, author, publicationYear, genre.Выведите название книги, используя точечную нотацию.

Выведите автора, используя скобочную нотацию и переменную propertyName = "author".

Измените publicationYear на более поздний.

Добавьте новое свойство isBestseller со значением true.

Удалите свойство genre.

Используйте for…in для перебора оставшихся свойств объекта и вывода их в консоль.

Используйте Object.values() для получения массива значений объекта и выведите его.

Используйте Object.entries() для получения пар ключ-значение и переберите их с помощью forEach() и деструктуризации.

Используя Math.random(), Math.floor() и Math.max(), Math.min(), напишите функцию getRandomInt(min, max), которая возвращает случайное целое число в заданном диапазоне (включая min и max).

Создайте объект userProfile со свойствами firstName, lastName. Напишите метод getFullName(), который возвращает полное имя, используя this.

Создайте объект currentDate типа Date.Выведите текущий год, месяц (не забудьте добавить 1, чтобы получить номер месяца от 1 до 12), день месяца.

Установите дату на 1 число следующего месяца.

Теперь мы умеем организовывать данные в виде списков (массивы) и структурированных коллекций (объекты), а также работать с математическими функциями и датами. Это фундамент для решения многих задач.

Следующая глава будет посвящена тому, как эти знания связать с внешним миром – как JavaScript взаимодействует с HTML-документом на странице.

Глава 7: Взаимодействие с Веб-Страницей: DOM.

В предыдущих главах мы освоили основы языка JavaScript: переменные, типы данных, операторы, условия, циклы и функции. Мы также научились работать с коллекциями данных – массивами и объектами. Теперь пришло время соединить JavaScript с тем, что видит пользователь – с веб-страницей.

Термин: DOM (Document Object Model) – это объектно-ориентированное представление HTML-документа. DOM (Document Object Model) представляет собой независимый от платформы и языка интерфейс программирования, который предоставляет возможность программам и скриптам взаимодействовать с HTML-, XHTML- и XML-документами. С его помощью можно получать доступ к содержимому документов, а также изменять их структуру, контент и визуальное представление.

Представьте DOM как дерево, где каждый узел дерева представляет собой часть HTML-документа: тег, атрибут, текст внутри тега. JavaScript может получить доступ к этому “дереву” и манипулировать им – изменять содержимое, стили, структуру, реагировать на действия пользователя.

Когда браузер загружает HTML-страницу, он создает DOM-представление этой страницы. JavaScript, запущенный в браузере, может взаимодействовать с этим DOM.

7.1. Что такое DOM (Структура дерева)

DOM не устанавливает жестких рамок для структуры документа. Любой документ, имеющий определенную структуру, может быть представлен в виде древовидной структуры узлов. Каждый узел в этой структуре соответствует элементу, текстовому фрагменту, графическому объекту или другому компоненту документа. Узлы связаны между собой иерархическими отношениями, подобными «родитель-потомок».

DOM представляет HTML-документ в виде иерархической структуры:

Документ (Document): Корневой узел всего DOM. В JavaScript это глобальный объект document.

Элементы (Elements): Каждый HTML-тег (например, , ,

,

,

) является узлом-элементом в DOM.

Атрибуты (Attributes): Атрибуты HTML-тегов (например, src в теге , href в теге , class или id) также являются узлами, но они обычно связаны с узлами-элементами.

Текстовые узлы (Text Nodes): Текст внутри HTML-элементов (например, “Привет, мир!” внутри тега

) также является узлом.

Пример HTML-структуры и ее DOM-представления:

html

Пример DOM

Заголовок

Это первый параграф.

DOM-представление этой структуры можно схематично показать так:

Document

└──

├──

│ ├──

│ └── (Текстовый узел: "Пример DOM")</p><p>└── <body></p><p>├── <h1> (Текстовый узел: "Заголовок")</p><p>├── <p id="intro"> (Текстовый узел: "Это первый параграф.")</p><p>└── <div class="content"></p><p>└── <p> (Текстовый узел: "Это второй параграф.")</p>7.2. Как найти элементы на странице<p>Чтобы манипулировать элементами, нам сначала нужно получить к ним доступ. JavaScript предоставляет несколько методов для поиска элементов в DOM.</p><p>А) Поиск по ID (getElementById)</p><p>Термин: ID (Identifier) – уникальный идентификатор элемента на странице. Каждый id должен быть уникален в пределах одного HTML-документа.</p><p>Метод document.getElementById(id) возвращает первый элемент, у которого указанный id.</p><p>javascript</p><p>// Предполагая, что на странице есть <p id="intro">…</p></p><p>let introParagraph = document.getElementById("intro");</p><p>console.log(introParagraph); // Выведет объект <p id="intro">…</p></p><p>// Теперь мы можем работать с этим элементом:</p><p>introParagraph.textContent = "Новый текст для параграфа."; // Изменяем текст</p><p>Б) Поиск по именам тегов (getElementsByTagName)</p><p>Метод document.getElementsByTagName(tagName) возвращает HTML-коллекцию (похожа на массив, но не совсем) всех элементов с указанным именем тега.</p><p>html</p><p><ul></p><p><li>Элемент 1</li></p><p><li>Элемент 2</li></p><p></ul></p><p><p>Какой-то текст.</p></p><p><ul></p><p><li>Элемент 3</li></p><p></ul></p><p>javascript</p><p>let allParagraphs = document.getElementsByTagName("p");</p><p>console.log(allParagraphs); // HTMLCollection [ <p>Какой-то текст.</p> ] (в данном случае)</p><p>let allLists = document.getElementsByTagName("ul");</p><p>console.log(allLists); // HTMLCollection [ <ul>…</ul>, <ul>…</ul> ]</p><p>// Доступ к элементам в коллекции по индексу</p><p>console.log(allLists[0]); // Первый <ul></p><p>console.log(allLists[1]); // Второй <ul></p><p>// Перебор коллекции (можно использовать for…of или обычный for)</p><p>for (let list of allLists) {</p><p>console.log(list);</p><p>}</p><p>Важно: getElementsByTagName возвращает живую коллекцию. Это значит, что если DOM изменится (например, добавятся новые элементы <li>), коллекция автоматически обновится.</p><p>В) Поиск по именам классов (getElementsByClassName)</p></div></div></div></div></div><div class="clearfix"></div><div><div class="Pagination_pagination__thWr5"><a class="Previous_prev__nRln6" href="/authors/aleksandr-olshevski/book-javascript-ot-osnov-do-full-stack-razrabotki-72648025-1547093/read/page=3"></a><a class="Pagination_pagination__link__innVr" href="/authors/aleksandr-olshevski/book-javascript-ot-osnov-do-full-stack-razrabotki-72648025-1547093/read">1</a><a class="Pagination_pagination__link__innVr" href="/authors/aleksandr-olshevski/book-javascript-ot-osnov-do-full-stack-razrabotki-72648025-1547093/read/page=2">2</a><a class="Pagination_pagination__link__innVr" href="/authors/aleksandr-olshevski/book-javascript-ot-osnov-do-full-stack-razrabotki-72648025-1547093/read/page=3">3</a><a class="Pagination_active__FIUxq" href="/authors/aleksandr-olshevski/book-javascript-ot-osnov-do-full-stack-razrabotki-72648025-1547093/read/page=4">4</a><a class="Pagination_pagination__link__innVr" href="/authors/aleksandr-olshevski/book-javascript-ot-osnov-do-full-stack-razrabotki-72648025-1547093/read/page=5">5</a><a class="Pagination_pagination__link__innVr" href="/authors/aleksandr-olshevski/book-javascript-ot-osnov-do-full-stack-razrabotki-72648025-1547093/read/page=6">6</a><a class="Next_next__5tJXc" href="/authors/aleksandr-olshevski/book-javascript-ot-osnov-do-full-stack-razrabotki-72648025-1547093/read/page=5"></a></div></div></div></div></div><div class="Footer_footer__kObrD"><div class="Footer_footer__content__n9bQa"><div class="Footer_footer__menu__gXS3F"><div><div class="Footer_footer__title__S4xDF">Разное</div><ul class="Footer_footer__subMenu__U0Bgr"><li class="Footer_footer__subItem__nFG_M"><a class="Footer_footer__subLink__z9Hux" href="/feedback">Обратная связь</a></li><li class="Footer_footer__subItem__nFG_M"><a class="Footer_footer__subLink__z9Hux" href="/faq">FAQ по библиотеке</a></li><li class="Footer_footer__subItem__nFG_M"><a class="Footer_footer__subLink__z9Hux" target="_blank" href="/redirect_to_self_pub_authors">Стать автором</a></li></ul></div><div><div class="Footer_footer__title__S4xDF">Партнеры</div><ul class="Footer_footer__subMenu__U0Bgr"><li class="Footer_footer__subItem__nFG_M"><a target="_blank" class="Footer_footer__subLink__z9Hux" href="https://www.litres.ru/?lfrom=1258056584">Литрес</a></li><li class="Footer_footer__subItem__nFG_M"><a target="_blank" class="Footer_footer__subLink__z9Hux" href="/redirect_to_self_pub">Литрес Самиздат</a></li><li class="Footer_footer__subItem__nFG_M"><a target="_blank" class="Footer_footer__subLink__z9Hux" href="/redirect_to_my_book">MyBook - книги онлайн</a></li></ul></div><div><div class="Footer_footer__title__S4xDF">Рассылки</div><ul class="Footer_footer__subMenu__U0Bgr"><li class="Footer_footer__subItem__nFG_M"><a class="Footer_footer__subLink__z9Hux" href="/new_books">Новинки книг</a></li><li class="Footer_footer__subItem__nFG_M"><a class="Footer_footer__subLink__z9Hux" href="/rss">Что такое RSS?</a></li></ul></div></div><div class="Footer_footer__bottom__UzXcE"><div class="Footer_footer__mail__tcRmh">По всем вопросам пишите нам на почту:<!-- --> <a class="Footer_footer__mailLink__D23Vn" href="mailto:support@bookz.ru">support@bookz.ru</a></div><div>2003-2025 bookZ.ru</div></div></div></div><div class="BottomBanner_litresBottomBanner__CCnlI"><a class="BottomBanner_litresBottomBanner__link__AN_9d" target="_blank" href="/redirect_to_self_pub"><img width="1920" height="60" loading="lazy" class="BottomBanner_litresBottomBanner__img__SMRfv" src="/banners/self-pub-1200x90.png" alt="banner"/><img width="450" height="100" loading="lazy" class="BottomBanner_litresBottomBanner__img__SMRfv BottomBanner_litresBottomBanner__img_mobile__UoR7n" src="/banners/self-pub-480x180.png" alt="banner"/></a></div></main><div class="StickyBanner_sticky_banner__NC2R_ " data-sticky-banner="true"><div class="StickyBanner_sticky_banner_btn__RQPM3" data-sticky-banner-btn="true"></div><div class="StickyBanner_sticky_banner_wrap__tQTE_"><div id="yandex_rtb_R-A-745623-15"></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"book":{"id":1547093,"book_id":1358142,"alias":"book-javascript-ot-osnov-do-full-stack-razrabotki-72648025-1547093","rating":4,"voted_users":28,"genres":[{"id":5270,"title":"программы","alias":"programmy"},{"id":5272,"title":"программирование","alias":"programmirovanie"},{"id":6487,"title":"книги о компьютерах","alias":"knigi_o_kompyuterah"}],"author":{"id":464896,"alias":"aleksandr-olshevski","first_name":"Александр","middle_name":"","last_name":"Ольшевски"},"other_author_books":[{"id":1527674,"alias":"audiobook-chatgpt-ot-geniia-do-bezumtsa-1527674","book":{"id":1527674,"external_id":72497644,"alias":"audiobook-chatgpt-ot-geniia-do-bezumtsa-1527674","title":"ChatGPT: От Гения до Безумца"}},{"id":1516666,"alias":"book-rukovodstvo-po-deepseek-glubokoe-pogruzhenie-v-mir-ney-72442138-1516666","book":{"id":1516666,"external_id":72442138,"alias":"book-rukovodstvo-po-deepseek-glubokoe-pogruzhenie-v-mir-ney-72442138-1516666","title":"Руководство по DeepSeek: Глубокое Погружение в Мир Нейросетей"}},{"id":1527645,"alias":"book-chatgpt-ot-geniya-do-bezumca-72497629-1527645","book":{"id":1527645,"external_id":72497629,"alias":"book-chatgpt-ot-geniya-do-bezumca-72497629-1527645","title":"ChatGPT: От Гения до Безумца"}},{"id":1516665,"alias":"book-unlock-chinese-discover-mandarin-72442141-1516665","book":{"id":1516665,"external_id":72442141,"alias":"book-unlock-chinese-discover-mandarin-72442141-1516665","title":"Unlock Chinese. Discover Mandarin"}}],"tags":[{"id":14,"title":"Самиздат","alias":"samizdat"},{"id":1099,"title":"разработка программного обеспечения","alias":"razrabotka-programmnogo-obespecheniia"},{"id":1454,"title":"обучение программированию","alias":"obuchenie-programmirovaniiu"},{"id":1539,"title":"языки программирования","alias":"iazyki-programmirovaniia"},{"id":2569,"title":"компьютерные технологии","alias":"kompiuternye-tekhnologii"},{"id":16605,"title":"только на Литрес","alias":"tolko-na-litres"},{"id":17026,"title":"язык JavaScript","alias":"iazyk-javascript"}],"book":{"id":1358142,"author_id":361381,"external_id":72648025,"external_uid":"23079684-a971-41a5-b099-e23650399bb7","alias":"javascript-ot-osnov-do-full-stack-razrabotki-72648025","title":"JavaScript: От Основ до Full-Stack Разработки","description":"Практическое руководство для современной веб-разработки на JavaScript. Книга предназначена для начинающих , а также желающих углубить свои знания до уровня профессионального Full-Stack разработчика.\nВы начнете с самых азов: погрузитесь в синтаксис, освоите типы данных, функции, объекты и современные возможности ES6+. Перейдете к созданию динамичных пользовательских интерфейсов с помощью мощного React-фреймворка, научитесь управлять состоянием, использовать хуки и строить сложные UI-компоненты.\nВас ждет погружение в мир Backend-разработки с Node.js. Вы освоите создание RESTful API на Express, работу с базами данных (SQL и NoSQL), научитесь строить масштабируемые серверные приложения. Особое внимание уделено тестированию кода (Unit-тесты с Jest), повышению надежности с помощью TypeScript – языка.\nКнига также охватывает темы, такие как архитектурные паттерны (SOLID, MVC), чистый код, DevOps и автоматизация (CI/CD, Docker), основы облачных технологий (AWS, Azure, GCP) и многое другое.\n","type":"book","lang":"ru","src_lang":"ru","year":2025,"publish_year":2025,"publish_city":null,"publisher":"SelfPub","isbn":null,"allow_full_free":0,"webtoon":false},"files":[{"type":"fb2.zip","size":412776,"external_file_id":72648025},{"type":"txt","size":506927,"external_file_id":72648025},{"type":"txt.zip","size":168491,"external_file_id":72648025},{"type":"rtf.zip","size":417703,"external_file_id":72648025},{"type":"a4.pdf","size":1041189,"external_file_id":72648025},{"type":"a6.pdf","size":1343936,"external_file_id":72648025},{"type":"mobi.prc","size":773238,"external_file_id":72648025},{"type":"epub","size":1330541,"external_file_id":72648025},{"type":"ios.epub","size":446990,"external_file_id":72648025},{"type":"fb3","size":417424,"external_file_id":72648025}],"reader":null,"translator":null,"related_posts":null,"hide_litres_data":false},"read":{"page":4,"pages":6,"type":"fb2","content":"\u003cp\u003econsole.log(colors); // Выведет: [\"красный\", \"желтый\", \"синий\"]\u003c/p\u003e\u003cp\u003eДобавление и удаление элементов (основные методы):\u003c/p\u003e\u003cp\u003eМассивы в JavaScript динамичны, то есть их размер может изменяться. Для этого существуют специальные методы:\u003c/p\u003e\u003cp\u003epush(element): Добавляет один или несколько элементов в конец массива. Возвращает новую длину массива.javascriptlet numbers = [1, 2];\u003c/p\u003e\u003cp\u003enumbers.push(3); // numbers теперь: [1, 2, 3]\u003c/p\u003e\u003cp\u003enumbers.push(4, 5); // numbers теперь: [1, 2, 3, 4, 5]\u003c/p\u003e\u003cp\u003elet newLength = numbers.push(6);\u003c/p\u003e\u003cp\u003econsole.log(numbers); // [1, 2, 3, 4, 5, 6]\u003c/p\u003e\u003cp\u003econsole.log(newLength); // 6\u003c/p\u003e\u003cp\u003epop(): Удаляет последний элемент из массива и возвращает его.javascriptlet fruits = [\"яблоко\", \"банан\", \"апельсин\"];\u003c/p\u003e\u003cp\u003elet lastFruit = fruits.pop();\u003c/p\u003e\u003cp\u003econsole.log(fruits); // [\"яблоко\", \"банан\"]\u003c/p\u003e\u003cp\u003econsole.log(lastFruit); // \"апельсин\"\u003c/p\u003e\u003cp\u003eunshift(element): Добавляет один или несколько элементов в начало массива. Возвращает новую длину массива.javascriptlet numbers = [2, 3];\u003c/p\u003e\u003cp\u003enumbers.unshift(1); // numbers теперь: [1, 2, 3]\u003c/p\u003e\u003cp\u003enumbers.unshift(0, -1); // numbers теперь: [-1, 0, 1, 2, 3]\u003c/p\u003e\u003cp\u003elet newLength = numbers.unshift(-2);\u003c/p\u003e\u003cp\u003econsole.log(numbers); // [-2, -1, 0, 1, 2, 3]\u003c/p\u003e\u003cp\u003econsole.log(newLength); // 6\u003c/p\u003e\u003cp\u003eshift(): Удаляет первый элемент из массива и возвращает его.javascriptlet fruits = [\"яблоко\", \"банан\", \"апельсин\"];\u003c/p\u003e\u003cp\u003elet firstFruit = fruits.shift();\u003c/p\u003e\u003cp\u003econsole.log(fruits); // [\"банан\", \"апельсин\"]\u003c/p\u003e\u003cp\u003econsole.log(firstFruit); // \"яблоко\"\u003c/p\u003e\u003cp\u003eМетоды для работы с частью массива:\u003c/p\u003e\u003cp\u003esplice(startIndex, deleteCount, item1, item2, …): Очень мощный метод, который может удалять, добавлять или заменять элементы в массиве.startIndex: Индекс, с которого начинать изменения.\u003c/p\u003e\u003cp\u003edeleteCount: Количество элементов для удаления (0 – если нужно только добавить).\u003c/p\u003e\u003cp\u003eitem1, item2, …: Элементы для добавления (если они есть).\u003c/p\u003e\u003cp\u003eВозвращает массив удаленных элементов (если они были).\u003c/p\u003e\u003cp\u003ejavascriptlet numbers = [1, 2, 3, 4, 5];\u003c/p\u003e\u003cp\u003e// Удалить 2 элемента, начиная с индекса 2\u003c/p\u003e\u003cp\u003elet removed = numbers.splice(2, 2);\u003c/p\u003e\u003cp\u003econsole.log(numbers); // [1, 2, 5] (удалены 3 и 4)\u003c/p\u003e\u003cp\u003econsole.log(removed); // [3, 4]\u003c/p\u003e\u003cp\u003e// Вставить элементы, не удаляя ничего, начиная с индекса 1\u003c/p\u003e\u003cp\u003enumbers.splice(1, 0, \"a\", \"b\");\u003c/p\u003e\u003cp\u003econsole.log(numbers); // [1, \"a\", \"b\", 2, 5]\u003c/p\u003e\u003cp\u003e// Заменить 1 элемент, начиная с индекса 3, на новый элемент\u003c/p\u003e\u003cp\u003enumbers.splice(3, 1, \"X\");\u003c/p\u003e\u003cp\u003econsole.log(numbers); // [1, \"a\", \"b\", \"X\", 5]\u003c/p\u003e\u003cp\u003eslice(startIndex, endIndex): Создает новый массив, содержащий копию части исходного массива. Не изменяет исходный массив.startIndex: Индекс, с которого начинать копирование.\u003c/p\u003e\u003cp\u003eendIndex (необязательный): Индекс, ДО которого включать элементы. Если не указан, копирует до конца массива.\u003c/p\u003e\u003cp\u003ejavascriptlet letters = [\"a\", \"b\", \"c\", \"d\", \"e\"];\u003c/p\u003e\u003cp\u003e// Скопировать элементы с индекса 1 до индекса 4 (не включая 4)\u003c/p\u003e\u003cp\u003elet subset1 = letters.slice(1, 4);\u003c/p\u003e\u003cp\u003econsole.log(subset1); // [\"b\", \"c\", \"d\"]\u003c/p\u003e\u003cp\u003econsole.log(letters); // [\"a\", \"b\", \"c\", \"d\", \"e\"] (исходный массив не изменился)\u003c/p\u003e\u003cp\u003e// Скопировать элементы с индекса 2 до конца\u003c/p\u003e\u003cp\u003elet subset2 = letters.slice(2);\u003c/p\u003e\u003cp\u003econsole.log(subset2); // [\"c\", \"d\", \"e\"]\u003c/p\u003e\u003cp\u003e// Использование отрицательных индексов (отсчет с конца)\u003c/p\u003e\u003cp\u003elet lastTwo = letters.slice(-2); // Два последних элемента\u003c/p\u003e\u003cp\u003econsole.log(lastTwo); // [\"d\", \"e\"]\u003c/p\u003e\u003cp\u003eДругие полезные методы массивов:\u003c/p\u003e\u003cp\u003econcat(array1, array2, …): Объединяет два или более массивов в новый массив.javascriptlet arr1 = [1, 2];\u003c/p\u003e\u003cp\u003elet arr2 = [3, 4];\u003c/p\u003e\u003cp\u003elet combined = arr1.concat(arr2, [5, 6]);\u003c/p\u003e\u003cp\u003econsole.log(combined); // [1, 2, 3, 4, 5, 6]\u003c/p\u003e\u003cp\u003econsole.log(arr1); // [1, 2] (исходный массив не изменился)\u003c/p\u003e\u003cp\u003eСинтаксис с spread-оператором (…) (let combined = […arr1, …arr2];) часто предпочтительнее для объединения массивов, так как он более современный и гибкий.\u003c/p\u003e\u003cp\u003ejoin(separator): Объединяет все элементы массива в одну строку, используя указанный separator. Если separator не указан, используется запятая.javascriptlet words = [\"Hello\", \"world\", \"!\"];\u003c/p\u003e\u003cp\u003elet sentence = words.join(\" \"); // Объединяем через пробел\u003c/p\u003e\u003cp\u003econsole.log(sentence); // \"Hello world !\"\u003c/p\u003e\u003cp\u003elet numbersString = [1, 2, 3].join(\"-\");\u003c/p\u003e\u003cp\u003econsole.log(numbersString); // \"1-2-3\"\u003c/p\u003e\u003cp\u003eincludes(element): Проверяет, есть ли элемент в массиве. Возвращает true или false.javascriptlet numbers = [1, 2, 3, 4];\u003c/p\u003e\u003cp\u003econsole.log(numbers.includes(3)); // true\u003c/p\u003e\u003cp\u003econsole.log(numbers.includes(5)); // false\u003c/p\u003e\u003cp\u003eindexOf(element): Возвращает индекс первого вхождения элемента в массив. Если элемент не найден, возвращает -1.javascriptlet fruits = [\"apple\", \"banana\", \"apple\", \"orange\"];\u003c/p\u003e\u003cp\u003econsole.log(fruits.indexOf(\"banana\")); // 1\u003c/p\u003e\u003cp\u003econsole.log(fruits.indexOf(\"apple\")); // 0 (индекс первого вхождения)\u003c/p\u003e\u003cp\u003econsole.log(fruits.indexOf(\"grape\")); // -1\u003c/p\u003e\u003cp\u003ereverse(): Инвертирует порядок элементов в массиве на месте (изменяет исходный массив) и возвращает ссылку на измененный массив.javascriptlet letters = [\"a\", \"b\", \"c\"];\u003c/p\u003e\u003cp\u003eletters.reverse();\u003c/p\u003e\u003cp\u003econsole.log(letters); // [\"c\", \"b\", \"a\"]\u003c/p\u003e\u003cp\u003eИтерация по массивам (уже видели for…of, но есть и другие способы):\u003c/p\u003e\u003cp\u003eС помощью for цикла:javascriptlet animals = [\"cat\", \"dog\", \"elephant\"];\u003c/p\u003e\u003cp\u003efor (let i = 0; i \u003c animals.length; i++) {\u003c/p\u003e\u003cp\u003econsole.log(`Animal at index ${i}: ${animals[i]}`);\u003c/p\u003e\u003cp\u003e}\u003c/p\u003e\u003cp\u003eforEach(callbackFunction): Выполняет функцию callbackFunction один раз для каждого элемента массива. callbackFunction получает три аргумента: element, index, array.javascriptlet fruits = [\"apple\", \"banana\", \"cherry\"];\u003c/p\u003e\u003cp\u003efruits.forEach(function(fruit, index, arr) {\u003c/p\u003e\u003cp\u003econsole.log(`Fruit at index ${index}: ${fruit}`);\u003c/p\u003e\u003cp\u003e// console.log(arr); // Можно получить доступ к самому массиву\u003c/p\u003e\u003cp\u003e});\u003c/p\u003e\u003cp\u003e// С использованием стрелочной функции:\u003c/p\u003e\u003cp\u003efruits.forEach((fruit, index) =\u003e {\u003c/p\u003e\u003cp\u003econsole.log(`Fruit #${index + 1}: ${fruit}`);\u003c/p\u003e\u003cp\u003e});\u003c/p\u003e6.2. Объекты (Objects): Хранение данных в формате “ключ-значение”\u003cp\u003eТермин: Объект (Object) – это неупорядоченная коллекция свойств. Каждое свойство состоит из ключа (key) и значения (value), которые связаны парой двоеточия :. Ключи обычно являются строками (или символами), а значения могут быть любого типа данных (включая другие объекты или массивы).\u003c/p\u003e\u003cp\u003eОбъекты используются для моделирования сущностей реального мира (например, человек, автомобиль, книга) или для группировки связанных данных.\u003c/p\u003e\u003cp\u003eСоздание объекта:\u003c/p\u003e\u003cp\u003eОбъекты создаются с помощью фигурных скобок {}.\u003c/p\u003e\u003cp\u003ejavascript\u003c/p\u003e\u003cp\u003e// Пустой объект\u003c/p\u003e\u003cp\u003elet emptyObject = {};\u003c/p\u003e\u003cp\u003e// Объект \"человек\"\u003c/p\u003e\u003cp\u003elet person = {\u003c/p\u003e\u003cp\u003ename: \"Алиса\", // Свойство: ключ \"name\", значение \"Алиса\"\u003c/p\u003e\u003cp\u003eage: 30, // Свойство: ключ \"age\", значение 30\u003c/p\u003e\u003cp\u003eisStudent: false, // Свойство: ключ \"isStudent\", значение false\u003c/p\u003e\u003cp\u003ecity: \"Москва\", // Свойство: ключ \"city\", значение \"Москва\"\u003c/p\u003e\u003cp\u003ehobbies: [\"чтение\", \"путешествия\"] // Свойство: значение – массив\u003c/p\u003e\u003cp\u003e};\u003c/p\u003e\u003cp\u003e// Объект \"автомобиль\"\u003c/p\u003e\u003cp\u003elet car = {\u003c/p\u003e\u003cp\u003ebrand: \"Toyota\",\u003c/p\u003e\u003cp\u003emodel: \"Camry\",\u003c/p\u003e\u003cp\u003eyear: 2022,\u003c/p\u003e\u003cp\u003e// Свойство, значение которого – другой объект\u003c/p\u003e\u003cp\u003eengine: {\u003c/p\u003e\u003cp\u003etype: \"Petrol\",\u003c/p\u003e\u003cp\u003evolume: 2.5\u003c/p\u003e\u003cp\u003e},\u003c/p\u003e\u003cp\u003e// Свойство, значение которого – функция (метод объекта)\u003c/p\u003e\u003cp\u003estart: function() {\u003c/p\u003e\u003cp\u003econsole.log(\"Двигатель запущен!\");\u003c/p\u003e\u003cp\u003e}\u003c/p\u003e\u003cp\u003e};\u003c/p\u003e\u003cp\u003eДоступ к свойствам объекта:\u003c/p\u003e\u003cp\u003eЕсть два основных способа:\u003c/p\u003e\u003cp\u003eТочечная нотация (Dot Notation): объект.ключ (наиболее распространенный и предпочтительный способ).javascriptconsole.log(person.name); // Выведет: Алиса\u003c/p\u003e\u003cp\u003econsole.log(person.age); // Выведет: 30\u003c/p\u003e\u003cp\u003econsole.log(car.brand); // Выведет: Toyota\u003c/p\u003e\u003cp\u003econsole.log(car.engine.type); // Доступ к свойству вложенного объекта. Выведет: Petrol\u003c/p\u003e\u003cp\u003eСкобочная нотация (Bracket Notation): объект[ключ] (обязательна, если ключ – переменная или содержит специальные символы/пробелы).javascriptconsole.log(person[\"name\"]); // Выведет: Алиса\u003c/p\u003e\u003cp\u003econsole.log(person[\"city\"]); // Выведет: Москва\u003c/p\u003e\u003cp\u003e// Пример, когда скобочная нотация обязательна:\u003c/p\u003e\u003cp\u003elet propertyName = \"age\";\u003c/p\u003e\u003cp\u003econsole.log(person[propertyName]); // Работает! Получим 30.\u003c/p\u003e\u003cp\u003e// person.propertyName выдало бы ошибку или undefined,\u003c/p\u003e\u003cp\u003e// так как искалось бы свойство с ключом \"propertyName\".\u003c/p\u003e\u003cp\u003e// Если ключ содержит пробелы или спецсимволы, скобочная нотация необходима:\u003c/p\u003e\u003cp\u003elet anotherPerson = {\u003c/p\u003e\u003cp\u003e\"first name\": \"Иван\",\u003c/p\u003e\u003cp\u003e\"last-name\": \"Петров\"\u003c/p\u003e\u003cp\u003e};\u003c/p\u003e\u003cp\u003econsole.log(anotherPerson[\"first name\"]); // \"Иван\"\u003c/p\u003e\u003cp\u003e// console.log(anotherPerson.first name); // Ошибка!\u003c/p\u003e\u003cp\u003eИзменение и добавление свойств:\u003c/p\u003e\u003cp\u003eСвойства объекта можно изменять или добавлять новые, используя точечную или скобочную нотацию.\u003c/p\u003e\u003cp\u003ejavascript\u003c/p\u003e\u003cp\u003elet user = { name: \"Петр\" };\u003c/p\u003e\u003cp\u003e// Изменение свойства\u003c/p\u003e\u003cp\u003euser.name = \"Петр Иванов\";\u003c/p\u003e\u003cp\u003econsole.log(user.name); // Петр Иванов\u003c/p\u003e\u003cp\u003e// Добавление нового свойства\u003c/p\u003e\u003cp\u003euser.age = 25;\u003c/p\u003e\u003cp\u003euser[\"isAdmin\"] = false; // Добавление через скобочную нотацию\u003c/p\u003e\u003cp\u003econsole.log(user); // { name: \"Петр Иванов\", age: 25, isAdmin: false }\u003c/p\u003e\u003cp\u003eУдаление свойств:\u003c/p\u003e\u003cp\u003eИспользуется оператор delete.\u003c/p\u003e\u003cp\u003ejavascript\u003c/p\u003e\u003cp\u003elet product = { id: 1, name: \"Ноутбук\", price: 1000 };\u003c/p\u003e\u003cp\u003edelete product.price;\u003c/p\u003e\u003cp\u003econsole.log(product); // { id: 1, name: \"Ноутбук\" }\u003c/p\u003e\u003cp\u003eМетоды объектов (функции внутри объектов):\u003c/p\u003e\u003cp\u003eФункции, которые являются свойствами объекта, называются методами.\u003c/p\u003e\u003cp\u003ejavascript\u003c/p\u003e\u003cp\u003elet calculator = {\u003c/p\u003e\u003cp\u003ea: 10,\u003c/p\u003e\u003cp\u003eb: 5,\u003c/p\u003e\u003cp\u003eadd: function() { // Метод add\u003c/p\u003e\u003cp\u003ereturn this.a + this.b; // this ссылается на объект calculator\u003c/p\u003e\u003cp\u003e},\u003c/p\u003e\u003cp\u003esubtract: function() { // Метод subtract\u003c/p\u003e\u003cp\u003ereturn this.a – this.b;\u003c/p\u003e\u003cp\u003e}\u003c/p\u003e\u003cp\u003e};\u003c/p\u003e\u003cp\u003econsole.log(calculator.add()); // Выведет: 15\u003c/p\u003e\u003cp\u003econsole.log(calculator.subtract()); // Выведет: 5\u003c/p\u003e\u003cp\u003e// Можно вызывать методы объекта:\u003c/p\u003e\u003cp\u003ecalculator.result = calculator.add();\u003c/p\u003e\u003cp\u003econsole.log(calculator.result); // 15\u003c/p\u003e\u003cp\u003eТермин: this – контекст выполнения. В методах объекта this обычно ссылается на сам объект, который вызывает этот метод. Понимание this – одна из ключевых (и иногда непростых) тем в JavaScript.\u003c/p\u003e\u003cp\u003eПеребор свойств объекта:\u003c/p\u003e\u003cp\u003efor…in цикл: Как мы уже видели, перебирает ключи объекта.javascriptlet book = {\u003c/p\u003e\u003cp\u003etitle: \"Война и мир\",\u003c/p\u003e\u003cp\u003eauthor: \"Лев Толстой\",\u003c/p\u003e\u003cp\u003eyear: 1869\u003c/p\u003e\u003cp\u003e};\u003c/p\u003e\u003cp\u003efor (let key in book) {\u003c/p\u003e\u003cp\u003econsole.log(`${key}: ${book[key]}`);\u003c/p\u003e\u003cp\u003e}\u003c/p\u003e\u003cp\u003e// Вывод:\u003c/p\u003e\u003cp\u003e// title: Война и мир\u003c/p\u003e\u003cp\u003e// author: Лев Толстой\u003c/p\u003e\u003cp\u003e// year: 1869\u003c/p\u003e\u003cp\u003eObject.keys(obj): Возвращает массив ключей объекта. Далее можно использовать forEach или for…of.javascriptlet car = { brand: \"BMW\", model: \"X5\", year: 2023 };\u003c/p\u003e\u003cp\u003elet carKeys = Object.keys(car); // [\"brand\", \"model\", \"year\"]\u003c/p\u003e\u003cp\u003econsole.log(carKeys);\u003c/p\u003e\u003cp\u003ecarKeys.forEach(key =\u003e {\u003c/p\u003e\u003cp\u003econsole.log(`${key}: ${car[key]}`);\u003c/p\u003e\u003cp\u003e});\u003c/p\u003e\u003cp\u003eObject.values(obj): Возвращает массив значений объекта.javascriptlet car = { brand: \"BMW\", model: \"X5\", year: 2023 };\u003c/p\u003e\u003cp\u003elet carValues = Object.values(car); // [\"BMW\", \"X5\", 2023]\u003c/p\u003e\u003cp\u003econsole.log(carValues);\u003c/p\u003e\u003cp\u003ecarValues.forEach(value =\u003e {\u003c/p\u003e\u003cp\u003econsole.log(value);\u003c/p\u003e\u003cp\u003e});\u003c/p\u003e\u003cp\u003eObject.entries(obj): Возвращает массив пар [ключ, значение].javascriptlet car = { brand: \"BMW\", model: \"X5\", year: 2023 };\u003c/p\u003e\u003cp\u003elet carEntries = Object.entries(car);\u003c/p\u003e\u003cp\u003e// carEntries будет: [ [\"brand\", \"BMW\"], [\"model\", \"X5\"], [\"year\", 2023] ]\u003c/p\u003e\u003cp\u003econsole.log(carEntries);\u003c/p\u003e\u003cp\u003ecarEntries.forEach(entry =\u003e {\u003c/p\u003e\u003cp\u003elet key = entry[0];\u003c/p\u003e\u003cp\u003elet value = entry[1];\u003c/p\u003e\u003cp\u003econsole.log(`${key}: ${value}`);\u003c/p\u003e\u003cp\u003e});\u003c/p\u003e\u003cp\u003e// С деструктуризацией (очень удобно!):\u003c/p\u003e\u003cp\u003ecarEntries.forEach(([key, value]) =\u003e {\u003c/p\u003e\u003cp\u003econsole.log(`${key} –\u003e ${value}`);\u003c/p\u003e\u003cp\u003e});\u003c/p\u003e6.3. Объект Math\u003cp\u003eТермин: Объект Math – это встроенный объект JavaScript, содержащий математические константы и функции для выполнения базовых и сложных математических вычислений. Его свойства и методы доступны напрямую, без необходимости его создавать.\u003c/p\u003e\u003cp\u003eПопулярные свойства:\u003c/p\u003e\u003cp\u003eMath.PI: Число Пи (≈ 3.14159)\u003c/p\u003e\u003cp\u003eMath.E: Основание натурального логарифма (≈ 2.71828)\u003c/p\u003e\u003cp\u003eПопулярные методы:\u003c/p\u003e\u003cp\u003eMath.round(x): Округляет число x до ближайшего целого.javascriptconsole.log(Math.round(4.7)); // 5\u003c/p\u003e\u003cp\u003econsole.log(Math.round(4.4)); // 4\u003c/p\u003e\u003cp\u003econsole.log(Math.round(4.5)); // 5\u003c/p\u003e\u003cp\u003eMath.floor(x): Округляет число x вниз до ближайшего целого.javascriptconsole.log(Math.floor(4.7)); // 4\u003c/p\u003e\u003cp\u003econsole.log(Math.floor(4.4)); // 4\u003c/p\u003e\u003cp\u003econsole.log(Math.floor(-4.4)); // -5 (округляет вниз, т.е. к меньшему числу)\u003c/p\u003e\u003cp\u003eMath.ceil(x): Округляет число x вверх до ближайшего целого.javascriptconsole.log(Math.ceil(4.7)); // 5\u003c/p\u003e\u003cp\u003econsole.log(Math.ceil(4.4)); // 5\u003c/p\u003e\u003cp\u003econsole.log(Math.ceil(-4.4)); // -4 (округляет вверх, т.е. к большему числу)\u003c/p\u003e\u003cp\u003eMath.abs(x): Возвращает абсолютное значение (модуль) числа x.javascriptconsole.log(Math.abs(-10)); // 10\u003c/p\u003e\u003cp\u003econsole.log(Math.abs(10)); // 10\u003c/p\u003e\u003cp\u003eMath.sqrt(x): Возвращает квадратный корень из x.javascriptconsole.log(Math.sqrt(9)); // 3\u003c/p\u003e\u003cp\u003econsole.log(Math.sqrt(2)); // 1.4142135623730951\u003c/p\u003e\u003cp\u003eMath.pow(base, exponent): Возвращает base в степени exponent.javascriptconsole.log(Math.pow(2, 3)); // 8 (2 в кубе)\u003c/p\u003e\u003cp\u003econsole.log(Math.pow(5, 2)); // 25 (5 в квадрате)\u003c/p\u003e\u003cp\u003eMath.random(): Возвращает псевдослучайное число с плавающей точкой между 0 (включительно) и 1 (не включительно).javascriptconsole.log(Math.random()); // Например: 0.123456789…\u003c/p\u003e\u003cp\u003econsole.log(Math.random()); // Другое случайное число\u003c/p\u003e\u003cp\u003eГенерация случайного целого числа в диапазоне: Часто нужно получить случайное целое число, например, от 0 до 9.javascript// Случайное целое от 0 до 9 (включительно)\u003c/p\u003e\u003cp\u003elet min = 0;\u003c/p\u003e\u003cp\u003elet max = 9;\u003c/p\u003e\u003cp\u003elet randomInt = Math.floor(Math.random() * (max – min + 1)) + min;\u003c/p\u003e\u003cp\u003econsole.log(randomInt); // Будет число от 0 до 9\u003c/p\u003e\u003cp\u003eMath.random() * (max – min + 1): Создает случайное число от 0 до max – min + 1 (не включая верхнюю границу).\u003c/p\u003e\u003cp\u003eMath.floor(…): Округляет вниз, чтобы получить целое число.\u003c/p\u003e\u003cp\u003e+ min: Сдвигает диапазон, чтобы он начинался с min.\u003c/p\u003e6.4. Объект Date\u003cp\u003eТермин: Объект Date – это встроенный объект JavaScript, который используется для работы с датами и временем. Он позволяет создавать, получать и устанавливать компоненты даты и времени (год, месяц, день, час, минута, секунда).\u003c/p\u003e\u003cp\u003eСоздание объекта Date:\u003c/p\u003e\u003cp\u003eБез аргументов: Создает объект Date с текущей датой и временем.javascriptlet now = new Date();\u003c/p\u003e\u003cp\u003econsole.log(now); // Выведет текущую дату и время в формате, зависящем от локали\u003c/p\u003e\u003cp\u003eС указанием даты и времени: Аргументы можно передавать в разном формате, но самый надежный – это комбинация числовых значений.javascript// new Date(год, месяц, день, час, минута, секунда, миллисекунда)\u003c/p\u003e\u003cp\u003e// Месяцы нумеруются с 0 (январь) до 11 (декабрь)!\u003c/p\u003e\u003cp\u003elet specificDate = new Date(2023, 10, 21, 14, 30, 0, 0); // 21 Ноября 2023, 14:30:00\u003c/p\u003e\u003cp\u003econsole.log(specificDate); // Выведет: Tue Nov 21 2023 14:30:00 GMT+0000 (Coordinated Universal Time) – формат может отличаться\u003c/p\u003e\u003cp\u003eВажно: Месяцы в Date нумеруются с 0 (январь) по 11 (декабрь). Это частый источник ошибок.\u003c/p\u003e\u003cp\u003eС указанием строки: Можно передать строку, но формат строки может интерпретироваться по-разному разными браузерами, поэтому этот способ менее надежен.javascriptlet dateFromString = new Date(\"2023-11-21T14:30:00\"); // ISO 8601 формат, более надежный\u003c/p\u003e\u003cp\u003econsole.log(dateFromString);\u003c/p\u003e\u003cp\u003eПолучение компонентов даты и времени:\u003c/p\u003e\u003cp\u003eОбъект Date имеет множество методов для получения отдельных частей даты/времени:\u003c/p\u003e\u003cp\u003egetFullYear(): Возвращает год (4 цифры).\u003c/p\u003e\u003cp\u003egetMonth(): Возвращает месяц (0-11). Помните про 0-индексацию!\u003c/p\u003e\u003cp\u003egetDate(): Возвращает день месяца (1-31).\u003c/p\u003e\u003cp\u003egetDay(): Возвращает день недели (0 – воскресенье, 1 – понедельник, …, 6 – суббота).\u003c/p\u003e\u003cp\u003egetHours(): Возвращает час (0-23).\u003c/p\u003e\u003cp\u003egetMinutes(): Возвращает минуты (0-59).\u003c/p\u003e\u003cp\u003egetSeconds(): Возвращает секунды (0-59).\u003c/p\u003e\u003cp\u003egetTime(): Возвращает количество миллисекунд, прошедших с 1 января 1970 года (Unix Timestamp). Полезно для сравнения дат или измерения интервалов.\u003c/p\u003e\u003cp\u003ejavascript\u003c/p\u003e\u003cp\u003elet myDate = new Date(2024, 0, 15, 10, 0, 0); // 15 Января 2024, 10:00:00\u003c/p\u003e\u003cp\u003econsole.log(\"Год:\", myDate.getFullYear()); // 2024\u003c/p\u003e\u003cp\u003econsole.log(\"Месяц:\", myDate.getMonth()); // 0 (Январь)\u003c/p\u003e\u003cp\u003econsole.log(\"День месяца:\", myDate.getDate()); // 15\u003c/p\u003e\u003cp\u003econsole.log(\"День недели:\", myDate.getDay()); // 1 (Понедельник)\u003c/p\u003e\u003cp\u003econsole.log(\"Час:\", myDate.getHours()); // 10\u003c/p\u003e\u003cp\u003econsole.log(\"Минуты:\", myDate.getMinutes()); // 0\u003c/p\u003e\u003cp\u003econsole.log(\"Секунды:\", myDate.getSeconds()); // 0\u003c/p\u003e\u003cp\u003econsole.log(\"Timestamp:\", myDate.getTime()); // Большое число миллисекунд\u003c/p\u003e\u003cp\u003eУстановка компонентов даты и времени:\u003c/p\u003e\u003cp\u003eТакже есть методы для установки значений:\u003c/p\u003e\u003cp\u003esetFullYear(year)\u003c/p\u003e\u003cp\u003esetMonth(month)\u003c/p\u003e\u003cp\u003esetDate(date)\u003c/p\u003e\u003cp\u003esetHours(hours, minutes, seconds, ms) (можно установить все сразу)\u003c/p\u003e\u003cp\u003esetTime(milliseconds)\u003c/p\u003e\u003cp\u003ejavascript\u003c/p\u003e\u003cp\u003elet today = new Date();\u003c/p\u003e\u003cp\u003etoday.setFullYear(2025);\u003c/p\u003e\u003cp\u003etoday.setMonth(0); // Устанавливаем январь\u003c/p\u003e\u003cp\u003etoday.setDate(1);\u003c/p\u003e\u003cp\u003econsole.log(today); // Дата станет 1 Января 2025 года\u003c/p\u003e\u003cp\u003eСравнение дат:\u003c/p\u003e\u003cp\u003eДаты можно сравнивать, используя обычные операторы сравнения (\u003c, \u003e, \u003c=, \u003e=). Сравнение происходит по их значению в миллисекундах (getTime()).\u003c/p\u003e\u003cp\u003ejavascript\u003c/p\u003e\u003cp\u003elet date1 = new Date(2024, 0, 15);\u003c/p\u003e\u003cp\u003elet date2 = new Date(2024, 0, 16);\u003c/p\u003e\u003cp\u003eif (date1 \u003c date2) {\u003c/p\u003e\u003cp\u003econsole.log(\"date1 раньше date2\"); // Выполнится\u003c/p\u003e\u003cp\u003e}\u003c/p\u003e\u003cp\u003eПрактическое задание:\u003c/p\u003e\u003cp\u003eСоздайте массив studentScores с несколькими числами (оценками).Добавьте новую оценку в конец массива с помощью push().\u003c/p\u003e\u003cp\u003eУдалите последнюю оценку с помощью pop() и сохраните ее в переменной droppedScore.\u003c/p\u003e\u003cp\u003eДобавьте оценку 100 в начало массива с помощью unshift().\u003c/p\u003e\u003cp\u003eУдалите первую оценку с помощью shift() и сохраните ее.\u003c/p\u003e\u003cp\u003eИспользуйте splice(), чтобы заменить оценку с индексом 2 на 95.\u003c/p\u003e\u003cp\u003eИспользуйте slice(), чтобы создать новый массив topScores из двух лучших оценок (предполагая, что они в конце массива).\u003c/p\u003e\u003cp\u003eИспользуйте includes(), чтобы проверить, есть ли в studentScores оценка 70.\u003c/p\u003e\u003cp\u003eИспользуйте indexOf() для поиска первой оценки 80.\u003c/p\u003e\u003cp\u003eИспользуйте join() для преобразования массива studentScores в строку с разделителем “-“.\u003c/p\u003e\u003cp\u003eПереберите массив studentScores с помощью forEach() и выведите каждую оценку.\u003c/p\u003e\u003cp\u003eСоздайте объект bookInfo со свойствами title, author, publicationYear, genre.Выведите название книги, используя точечную нотацию.\u003c/p\u003e\u003cp\u003eВыведите автора, используя скобочную нотацию и переменную propertyName = \"author\".\u003c/p\u003e\u003cp\u003eИзмените publicationYear на более поздний.\u003c/p\u003e\u003cp\u003eДобавьте новое свойство isBestseller со значением true.\u003c/p\u003e\u003cp\u003eУдалите свойство genre.\u003c/p\u003e\u003cp\u003eИспользуйте for…in для перебора оставшихся свойств объекта и вывода их в консоль.\u003c/p\u003e\u003cp\u003eИспользуйте Object.values() для получения массива значений объекта и выведите его.\u003c/p\u003e\u003cp\u003eИспользуйте Object.entries() для получения пар ключ-значение и переберите их с помощью forEach() и деструктуризации.\u003c/p\u003e\u003cp\u003eИспользуя Math.random(), Math.floor() и Math.max(), Math.min(), напишите функцию getRandomInt(min, max), которая возвращает случайное целое число в заданном диапазоне (включая min и max).\u003c/p\u003e\u003cp\u003eСоздайте объект userProfile со свойствами firstName, lastName. Напишите метод getFullName(), который возвращает полное имя, используя this.\u003c/p\u003e\u003cp\u003eСоздайте объект currentDate типа Date.Выведите текущий год, месяц (не забудьте добавить 1, чтобы получить номер месяца от 1 до 12), день месяца.\u003c/p\u003e\u003cp\u003eУстановите дату на 1 число следующего месяца.\u003c/p\u003e\u003cp\u003eТеперь мы умеем организовывать данные в виде списков (массивы) и структурированных коллекций (объекты), а также работать с математическими функциями и датами. Это фундамент для решения многих задач.\u003c/p\u003e\u003cp\u003eСледующая глава будет посвящена тому, как эти знания связать с внешним миром – как JavaScript взаимодействует с HTML-документом на странице.\u003c/p\u003e\u003c/section\u003e\u003csection\u003e\u003ch3\u003e\u003cp\u003eГлава 7: Взаимодействие с Веб-Страницей: DOM.\u003c/p\u003e\u003c/h3\u003e\u003cp\u003eВ предыдущих главах мы освоили основы языка JavaScript: переменные, типы данных, операторы, условия, циклы и функции. Мы также научились работать с коллекциями данных – массивами и объектами. Теперь пришло время соединить JavaScript с тем, что видит пользователь – с веб-страницей.\u003c/p\u003e\u003cp\u003eТермин: DOM (Document Object Model) – это объектно-ориентированное представление HTML-документа. DOM (Document Object Model) представляет собой независимый от платформы и языка интерфейс программирования, который предоставляет возможность программам и скриптам взаимодействовать с HTML-, XHTML- и XML-документами. С его помощью можно получать доступ к содержимому документов, а также изменять их структуру, контент и визуальное представление.\u003c/p\u003e\u003cp\u003eПредставьте DOM как дерево, где каждый узел дерева представляет собой часть HTML-документа: тег, атрибут, текст внутри тега. JavaScript может получить доступ к этому “дереву” и манипулировать им – изменять содержимое, стили, структуру, реагировать на действия пользователя.\u003c/p\u003e\u003cp\u003eКогда браузер загружает HTML-страницу, он создает DOM-представление этой страницы. JavaScript, запущенный в браузере, может взаимодействовать с этим DOM.\u003c/p\u003e7.1. Что такое DOM (Структура дерева)\u003cp\u003eDOM не устанавливает жестких рамок для структуры документа. Любой документ, имеющий определенную структуру, может быть представлен в виде древовидной структуры узлов. Каждый узел в этой структуре соответствует элементу, текстовому фрагменту, графическому объекту или другому компоненту документа. Узлы связаны между собой иерархическими отношениями, подобными «родитель-потомок».\u003c/p\u003e\u003cp\u003eDOM представляет HTML-документ в виде иерархической структуры:\u003c/p\u003e\u003cp\u003eДокумент (Document): Корневой узел всего DOM. В JavaScript это глобальный объект document.\u003c/p\u003e\u003cp\u003eЭлементы (Elements): Каждый HTML-тег (например, \u003chtml\u003e, \u003cbody\u003e, \u003ch1\u003e, \u003cp\u003e, \u003cdiv\u003e) является узлом-элементом в DOM.\u003c/p\u003e\u003cp\u003eАтрибуты (Attributes): Атрибуты HTML-тегов (например, src в теге \u003cimg\u003e, href в теге \u003ca\u003e, class или id) также являются узлами, но они обычно связаны с узлами-элементами.\u003c/p\u003e\u003cp\u003eТекстовые узлы (Text Nodes): Текст внутри HTML-элементов (например, “Привет, мир!” внутри тега \u003cp\u003e) также является узлом.\u003c/p\u003e\u003cp\u003eПример HTML-структуры и ее DOM-представления:\u003c/p\u003e\u003cp\u003ehtml\u003c/p\u003e\u003cp\u003e\u003c!DOCTYPE html\u003e\u003c/p\u003e\u003cp\u003e\u003chtml lang=\"ru\"\u003e\u003c/p\u003e\u003cp\u003e\u003chead\u003e\u003c/p\u003e\u003cp\u003e\u003cmeta charset=\"UTF-8\"\u003e\u003c/p\u003e\u003cp\u003e\u003ctitle\u003eПример DOM\u003c/title\u003e\u003c/p\u003e\u003cp\u003e\u003c/head\u003e\u003c/p\u003e\u003cp\u003e\u003cbody\u003e\u003c/p\u003e\u003cp\u003e\u003ch1\u003eЗаголовок\u003c/h1\u003e\u003c/p\u003e\u003cp\u003e\u003cp id=\"intro\"\u003eЭто первый параграф.\u003c/p\u003e\u003c/p\u003e\u003cp\u003e\u003cdiv class=\"content\"\u003e\u003c/p\u003e\u003cp\u003e\u003cp\u003eЭто второй параграф.\u003c/p\u003e\u003c/p\u003e\u003cp\u003e\u003c/div\u003e\u003c/p\u003e\u003cp\u003e\u003c/body\u003e\u003c/p\u003e\u003cp\u003e\u003c/html\u003e\u003c/p\u003e\u003cp\u003eDOM-представление этой структуры можно схематично показать так:\u003c/p\u003e\u003cp\u003eDocument\u003c/p\u003e\u003cp\u003e└── \u003chtml\u003e\u003c/p\u003e\u003cp\u003e├── \u003chead\u003e\u003c/p\u003e\u003cp\u003e│ ├── \u003cmeta charset=\"UTF-8\"\u003e\u003c/p\u003e\u003cp\u003e│ └── \u003ctitle\u003e (Текстовый узел: \"Пример DOM\")\u003c/p\u003e\u003cp\u003e└── \u003cbody\u003e\u003c/p\u003e\u003cp\u003e├── \u003ch1\u003e (Текстовый узел: \"Заголовок\")\u003c/p\u003e\u003cp\u003e├── \u003cp id=\"intro\"\u003e (Текстовый узел: \"Это первый параграф.\")\u003c/p\u003e\u003cp\u003e└── \u003cdiv class=\"content\"\u003e\u003c/p\u003e\u003cp\u003e└── \u003cp\u003e (Текстовый узел: \"Это второй параграф.\")\u003c/p\u003e7.2. Как найти элементы на странице\u003cp\u003eЧтобы манипулировать элементами, нам сначала нужно получить к ним доступ. JavaScript предоставляет несколько методов для поиска элементов в DOM.\u003c/p\u003e\u003cp\u003eА) Поиск по ID (getElementById)\u003c/p\u003e\u003cp\u003eТермин: ID (Identifier) – уникальный идентификатор элемента на странице. Каждый id должен быть уникален в пределах одного HTML-документа.\u003c/p\u003e\u003cp\u003eМетод document.getElementById(id) возвращает первый элемент, у которого указанный id.\u003c/p\u003e\u003cp\u003ejavascript\u003c/p\u003e\u003cp\u003e// Предполагая, что на странице есть \u003cp id=\"intro\"\u003e…\u003c/p\u003e\u003c/p\u003e\u003cp\u003elet introParagraph = document.getElementById(\"intro\");\u003c/p\u003e\u003cp\u003econsole.log(introParagraph); // Выведет объект \u003cp id=\"intro\"\u003e…\u003c/p\u003e\u003c/p\u003e\u003cp\u003e// Теперь мы можем работать с этим элементом:\u003c/p\u003e\u003cp\u003eintroParagraph.textContent = \"Новый текст для параграфа.\"; // Изменяем текст\u003c/p\u003e\u003cp\u003eБ) Поиск по именам тегов (getElementsByTagName)\u003c/p\u003e\u003cp\u003eМетод document.getElementsByTagName(tagName) возвращает HTML-коллекцию (похожа на массив, но не совсем) всех элементов с указанным именем тега.\u003c/p\u003e\u003cp\u003ehtml\u003c/p\u003e\u003cp\u003e\u003cul\u003e\u003c/p\u003e\u003cp\u003e\u003cli\u003eЭлемент 1\u003c/li\u003e\u003c/p\u003e\u003cp\u003e\u003cli\u003eЭлемент 2\u003c/li\u003e\u003c/p\u003e\u003cp\u003e\u003c/ul\u003e\u003c/p\u003e\u003cp\u003e\u003cp\u003eКакой-то текст.\u003c/p\u003e\u003c/p\u003e\u003cp\u003e\u003cul\u003e\u003c/p\u003e\u003cp\u003e\u003cli\u003eЭлемент 3\u003c/li\u003e\u003c/p\u003e\u003cp\u003e\u003c/ul\u003e\u003c/p\u003e\u003cp\u003ejavascript\u003c/p\u003e\u003cp\u003elet allParagraphs = document.getElementsByTagName(\"p\");\u003c/p\u003e\u003cp\u003econsole.log(allParagraphs); // HTMLCollection [ \u003cp\u003eКакой-то текст.\u003c/p\u003e ] (в данном случае)\u003c/p\u003e\u003cp\u003elet allLists = document.getElementsByTagName(\"ul\");\u003c/p\u003e\u003cp\u003econsole.log(allLists); // HTMLCollection [ \u003cul\u003e…\u003c/ul\u003e, \u003cul\u003e…\u003c/ul\u003e ]\u003c/p\u003e\u003cp\u003e// Доступ к элементам в коллекции по индексу\u003c/p\u003e\u003cp\u003econsole.log(allLists[0]); // Первый \u003cul\u003e\u003c/p\u003e\u003cp\u003econsole.log(allLists[1]); // Второй \u003cul\u003e\u003c/p\u003e\u003cp\u003e// Перебор коллекции (можно использовать for…of или обычный for)\u003c/p\u003e\u003cp\u003efor (let list of allLists) {\u003c/p\u003e\u003cp\u003econsole.log(list);\u003c/p\u003e\u003cp\u003e}\u003c/p\u003e\u003cp\u003eВажно: getElementsByTagName возвращает живую коллекцию. Это значит, что если DOM изменится (например, добавятся новые элементы \u003cli\u003e), коллекция автоматически обновится.\u003c/p\u003e\u003cp\u003eВ) Поиск по именам классов (getElementsByClassName)\u003c/p\u003e"},"pageNumber":"4","_sentryTraceData":"844804e3e7e9432bbb918d70f037422f-9e29673244337f6b-0","_sentryBaggage":"sentry-environment=production,sentry-release=RpUBsK9nafARtuYLd-51E,sentry-public_key=04eab6043f8a4d5dd6ab92058ea491e6,sentry-trace_id=844804e3e7e9432bbb918d70f037422f,sentry-sample_rate=0.05,sentry-transaction=%2Fauthors%2F%5Balias%5D%2F%5BbookAlias%5D%2Fread%2F%5BpageNumber%5D,sentry-sampled=false"},"__N_SSP":true},"page":"/authors/[alias]/[bookAlias]/read/[pageNumber]","query":{"alias":"aleksandr-olshevski","bookAlias":"book-javascript-ot-osnov-do-full-stack-razrabotki-72648025-1547093","pageNumber":"4"},"buildId":"RpUBsK9nafARtuYLd-51E","isFallback":false,"isExperimentalCompile":false,"gssp":true,"scriptLoader":[]}</script></body></html>