логотип PurpleSchool
  • Бесплатно
      Карта развитияОсновы разработкиCSS Flexbox
    • Новостные рассылкиИконка стрелки
    • База знанийИконка стрелки
    • Карьерные пути
      • Frontend React разработчик
      • Frontend Vue разработчик
      • Backend разработчик Node.js
      • Fullstack разработчик React / Node.js
      • Mobile разработчик React Native
      • Backend разработчик Golang
      • Devops инженер
    • О нас
      • Отзывы
      • Реферальная программа
      • О компании
      • Контакты
    • Иконка открытия меню
      • Сообщество
      • PurpleПлюс
      • AI тренажёр
      • Проекты
    логотип PurpleSchool
    ютуб иконка
    Telegram иконка
    VK иконка
    Курсы
    ГлавнаяКаталог курсовFrontendBackendFullstack
    Практика
    КарьераПроектыPurpleПлюс
    Материалы
    БлогБаза знаний
    Документы
    Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
    Реквизиты
    ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

    PurpleSchool © 2020 -2025 Все права защищены

  • Курсы
    Иконка слояПерейти в каталог курсов
    • FrontendИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    • Картинка группы Общее

      Общее


      • Основы разработки
      • Основы Git
      • HTML и CSS
      • CSS Flexbox
      • Основы JavaScript
      • Продвинутый JavaScript
      • TypeScript с нуля
      • Neovim
    • Картинка группы React

      React


      • React и Redux Toolkit
      • Zustand
      • Next.js - с нуля
      • Feature-Sliced Design
    • Картинка группы Vue.js

      Vue.js


      • Vue 3 и Pinia
      • Nuxt
      • Feature-Sliced Design
    • Картинка группы Angular

      Angular


      • Angular 19 Иконка курсаСкоро!
    • Картинка группы Node.js

      Node.js


      • Основы Git
      • Основы JavaScript
      • Продвинутый JavaScript
      • Telegraf.js Иконка курсаСкоро!
      • TypeScript с нуля
      • Node.js с нуля
      • Nest.js с нуля
    • Картинка группы Golang

      Golang


      • Основы Git
      • Основы Golang
      • Продвинутый Golang
      • Golang - Templ Fiber HTMX
    • Картинка группы C#

      C#


      • Основы C#
    • Картинка группы PHP

      PHP


      • Основы PHP Иконка курсаСкоро!
    • Картинка группы Python

      Python


      • Основы Python
      • Продвинутый Python
    • Картинка группы Общее

      Общее


      • Основы разработки
      • Docker и Ansible
      • Kubernetes и Helm
      • Микросервисы
      • Neovim
    • Картинка группы Общее

      Общее


      • Основы разработки
      • Основы Git
      • Основы Linux
      • Bash скрипты
      • Docker и Ansible
      • Kubernetes и Helm
      • Микросервисы
      • Neovim
    • Картинка группы Общее

      Общее


      • Основы разработки
      • Основы Git
      • Neovim
    • Картинка группы React Native

      React Native


      • HTML и CSS
      • Основы JavaScript
      • Продвинутый JavaScript
      • TypeScript с нуля
      • React и Redux Toolkit
      • React Native и Expo Router
    • Картинка группы Swift

      Swift


      • Основы Swift и iOS
    • Картинка группы Общее

      Общее


      • Продвинутое тестирование Иконка курсаСкоро!
      • Основы тестирования ПО
    • Картинка группы Общее

      Общее


      • Собеседование
      • Современный Agile
    • Картинка группы Figma

      Figma


      • Основы дизайна
  • логотип PurpleSchool
    • Сообщество
    • PurpleПлюс
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Основы JavaScript для начинающих

    Основы JavaScript для начинающих

    Аватар автора Основы JavaScript для начинающих

    Вячеслав Руденко

    Иконка календаря06 января 2024

    Введение

    JavaScript – это ключ к волнующему миру веб-разработки, в котором он играет важную роль и на стороне клиента (в браузере пользователя), и на стороне сервера. Начать изучение JavaScript – значит взглянуть на мир программирования с широкой перспективы. Почему этот язык так важен?

    Зачем изучать JavaScript?

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

    Роль JavaScript в веб-разработке

    JavaScript на стороне клиента используется для создания интерактивных пользовательских интерфейсов, в то время как на стороне сервера он используется для обработки запросов, управления базами данных и бизнес-логикой. Этот язык становится ключевым элементом технологического стека веб-разработчика.

    Краткий обзор структуры статьи

    Статья представляет собой полное руководство по основам JavaScript, охватывая ключевые концепции, необходимые для старта вашего пути в программировании. Мы начнем с базового синтаксиса и постепенно перейдем к более сложным темам, таким как функции и объекты. Каждая часть статьи подкреплена примерами кода и практическими заданиями, чтобы обеспечить легкость усвоения материала. Независимо от вашего уровня подготовки, это руководство призвано убедить вас: программирование – это увлекательное и доступное искусство, которое можно освоить сегодня.

    Основы синтаксиса JavaScript

    Один из первых шагов в мире программирования – это понимание, как хранить и обрабатывать данные. В JavaScript для этого используются переменные и типы данных. Давайте рассмотрим это на простых и понятных примерах.

    Переменные

    Переменные – это контейнеры для хранения данных. В JavaScript есть три ключевых слова для создания переменных: let, const, и var.

    let:  переменные, объявленные с использованием let, могут изменяться после их создания.

    let name = 'John'; name = 'Max'; // Допустимо, можно изменять
    

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

    const PI = 3.14;
    PI = 8; // Недопустимо, приведет к ошибке
    

    var: Ранее использовавшееся ключевое слово для объявления переменных. В отличие от let и const, var имеет различное поведение в некоторых случаях, и его использование старается избегаться в современном коде. 

    var x = 5;
    

    Комментарии в коде

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

    Однострочные комментарии и комментарии после кода начинаются с двойного слэша ( // ).

    // Это однострочный комментарий
    let name = 'John';
    let age = 25; // Это комментарий к переменной "age"
    

    Многострочные комментарии начинаются с /* и заканчиваются */. Они могут охватывать несколько строк:

    /*
      Это многострочный комментарий.
      Он может охватывать несколько строк и использоваться для
      более подробных пояснений к блокам кода.
    */
    let year = 2024;
    

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

    Типы данных

    JavaScript поддерживает различные типы данных, и важно знать, какой тип данных используется в вашем коде. Рассмотрим основные типы:

    Строки Strings используются для текстовой информации.

    let greeting = 'Привет, мир!';
    

    Числа Numbers используются для представления числовых значений.

    let age = 42;
    

    Логические значения Booleans представляют истину true или ложь false.

    let isAdmin = true; let isMarried = false;
    

    Значение null не относится ни к одному из типов, описанных выше. Оно формирует отдельный тип, который содержит только значение null:

    let surname = null;
    

    Это значение представляет собой «ничего», «пусто» или «значение неизвестно».

    Значение undefined Оно означает, что значение не было присвоено

    let age; 
    let name = undefined;
    

    Если переменная объявлена, но ей не присвоено никакого значения, то её значением будет undefined Мы можем сами присвоить значение undefined любой переменной

    Арифметические операторы

    Арифметические операторы используются для выполнения математических операций. Рассмотрим примеры:

    • Сложение ( + )
    • Вычитание ( - )
    • Умножение ( * )
    • Деление ( / )
    • Остаток от деления ( % )

    Давайте посмотрим как это работает в JavaScript:

    let sum = 5 + 3;         // Результат: 8
    let difference = 10 - 4; // Результат: 6
    let product = 3 * 5;     // Результат: 15
    let quotient = 20 / 4;   // Результат: 5
    let remainder = 15 % 7;  // Результат: 1
    

    Строковые операторы

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

    Конкатенация ( + ):

    let greeting = 'Привет' + ' ' + 'мир!'; // Результат: 'Привет мир!'
    

    Операторы сравнения

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

    Равно ( == ) cравнивает значения с приведением типов (приводит типы, если они отличаются).

    let logical_and = true && false; // Результат: false
    

    В данном примере строка '5' приволится к числу 5 происходит сравнение числа 5 и числа 5.

    Строго равно ( === ) cравнивает значения без приведения типов (сравнивает значения и типы данных).

    let strictly_equal = number1 === number2; // Результат: false
    

    В большинстве случаев рекомендуется использовать ===, чтобы избежать неожиданных результатов, связанных с приведением типов.

    Преобразование типов

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

    Преобразование в число (Number()) используется для преобразования значения в число. Рассмотрим пример:

    let num = Number('123'); 
    console.log(num); // Вывод: 123
    

    Преобразование в строку (String()) используется для преобразования значения в строку:

    let str = String(456); 
    console.log(str); // Вывод: '456'
    

    Преобразование в булево (Boolean()) используется для преобразования значения в булево (логическое) значение.

    let boolean_value_1 = Boolean(0); 
    let boolean_value_2 = Boolean(1); 
    let boolean_value_3 = Boolean(50);
    
    console.log(boolean_value_1); // Вывод: false 
    console.log(boolean_value_2); // Вывод: true 
    console.log(boolean_value_3); // Вывод: true 
    

    Автоматическое преобразование типов в JavaScript происходит во время выполнения операций, когда операторы или функции ожидают определенный тип данных, отличающийся от текущего. Давайте рассмотрим различные сценарии автоматического преобразования и приведем примеры.

    В данном случае, при конкатенации строки и числа, число автоматически преобразуется в строку:

    let str = 'Возраст: ' + 42; 
    
    console.log(str); // Вывод: 'Возраст: 42'
    

    Оператор умножения * приводит строку к числу

    let num = '123' * 1; 
    
    console.log(num); // Вывод: 123
    

    Двойное отрицание !! используется для преобразования значения в булево. Все строки, кроме пустой строки, преобразуются в true.

    let boolean_value = !!'Какая-то строка'; 
    
    console.log(boolean_value); // Вывод: true
    

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

    Логические операторы

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

    И (&&) возвращает true, если оба значения являются истинными, иначе возвращает false

    let logical_and = true && false; // Результат: false
    

    Часто используется в условиях, где необходимо, чтобы все условия были истинными.

    Оператор ИЛИ (||): возвращает true, если хотя бы одно из значений истинно, иначе возвращает false

     let logical_or = true || false; // Результат: true
    

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

    Оператор НЕ (!): инвертирует логическое значение. Если значение было true, то оно становится false, и наоборот

    let negation = !true; // Результат: false
    

    Используется для инверсии логического значения

    Условные операторы (if, else)

    Условные операторы в JavaScript позволяют вам принимать решения на основе логики ваших программ. Они позволяют выполнять определенные блоки кода только при соблюдении определенных условий.

    Оператор if

    Оператор if используется для выполнения кода, если заданное условие истинно.

    let age = 18;
    
    if (age >= 18) {
      console.log('Вы совершеннолетний!');
    }
    

    Если значение переменной age больше или равно 18, то код внутри блока if будет выполнен

    Оператор else

    Оператор else используется для выполнения кода, если условие в ifне является истинным.

    let age = 16;
    
    if (age >= 18) {
      console.log('Вы совершеннолетний');
    } else {
      console.log('Вы несовершеннолетний');
    }
    

    Если значение переменной age меньше 18, то выполнится код внутри блока else.

    Оператор else if

    Оператор else if используется для добавления дополнительных условий, которые проверяются, если предыдущие условия были ложными.

    let age = 22;
    
    if (age < 18) {
      console.log('Вы несовершеннолетний');
    } else if (age < 25) {
      console.log('Вы молодой');
    } else {
      console.log('Вы взрослый');
    }
    

    Если значение age меньше 18, выполнится первый блок. Если от 18 до 24, выполнится второй блок, иначе выполнится блок else.

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

    Циклы (for, while)

    Циклы в JavaScript предоставляют механизм для многократного выполнения одного и того же участка кода. Давайте рассмотрим два основных типа циклов: for и while.

    Цикл for

    Цикл for предназначен для выполнения блока кода определенное количество раз.

    for (let i = 0; i < 5; i++) {
      console.log('Это итерация номер ' + (i + 1));
    }
    
    1. let i = 0: Начальное значение счетчика.
    2. i < 5: Условие выполнения цикла.
    3. i++: Инкремент (увеличение счетчика на 1).

    Давайте рассмотрим простой пример использования цикла для подсчета суммы чисел от 1 до 10. Мы будем использовать цикл for для итерации от 1 до 10 и накапливать сумму чисел в переменной sum.

    let sum = 0;
    
    for (let i = 1; i <= 10; i++) {
      sum += i;
    }
    
    console.log('Сумма чисел от 1 до 10: ' + sum); // Вывод: 55
    
    1. let сумма = 0;: Мы инициализируем переменную сумма значением 0.
    2. for (let i = 1; i <= 10; i++): Цикл for начинается с 1, выполняется до 10 (включительно), и каждую итерацию увеличивает значение i на 1.
    3. сумма += i;: Мы добавляем текущее значение i к переменной sum на каждой итерации.

    После завершения цикла мы выводим сумму чисел от 1 до 10, которая равна 55 в этом случае.

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

    Цкил while

    Цикл whileвыполняет блок кода, пока условие в скобочках истинно.

    Пример:

    let counter = 0;
    
    while (counter < 3) {
      console.log('Это итерация номер ' + (counter + 1));
      counter = counter + 1;
    }
    
    1. let counter = 0: Инициализация счетчика перед циклом.
    2. counter < 3: Условие выполнения цикла.
    3. counter = counter + 1: Инкремент счетчика внутри цикла.

    Цикл while подходит для ситуаций, когда точное количество итераций заранее неизвестно, и выполнение зависит от условия. В данном примере, цикл будет выполняться, пока число меньше 3.

    Массивы

    Массивы в JavaScript представляют собой упорядоченные списки значений, которые могут содержать различные типы данных. Вот ключевые аспекты работы с массивами:

    Существует два варианта синтаксиса для создания пустого массива:

    let emptyArray = [];
    let emptyArray = new Array();
    

    Создание массива с элементами:

    let arrayOfNumbers = [1, 2, 3, 4, 5];
    let arrayOfStrings = ['apple', 'banana', 'orange'];
    let mixedArray = [1, 'two', true, [1, 2, 3]];
    

    Элементы массива нумеруются, начиная с нуля.

    Мы можем получить элемент, указав его номер в квадратных скобках:

    console.log(arrayOfStrings[0]); // Вывод: 'apple'
    console.log(arrayOfStrings[1]); // Вывод: 'banana'
    console.log(arrayOfStrings[2]); // Вывод: 'orange'
    

    Мы можем заменить элемент:

    arrayOfStrings[2] = 'mango'; // Теперь ['apple', 'banana', 'mango']
    

    Мы можем узнать длину массива с помощью метода length:

    console.log(arrayOfStrings.length); // Вывод: 3
    

    Мы можем добавить элемент к уже существующему массиву:

    // Добавляем элемент в конец массива
    arrayOfStrings.push('mango'); // Теперь ['apple', 'banana', 'orange', 'mango']
    
    // Добавляем элемент в начало массива
    arrayOfStrings.unshift('mango'); // Теперь ['mango', 'apple', 'banana', 'orange']
    

    Мы можем удалять элементы массива:

    // Удаление последнего элемента
    arrayOfStrings.pop(); // ['apple', 'banana']
    
    // Удаление первого элемента
    arrayOfStrings.shift(); // ['banana', 'orange']
    

    Мы можем использовать цикл for для перебора массива:

    let arratOfNumbers = [10, 20, 30];
    
    for (let i = 0; i < arratOfNumbers.length; i++) {
      console.log(arratOfNumbers[i]);
    }
    

    Функции

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

    Объявление и вызов функций

    Функции в JavaScript могут быть объявлены с использованием ключевого слова function

    function sayHi() {
      console.log('Привет, мир!');
    }
    

    Вызвать функции можно по имени с использованием круглых скобок:

    sayHi(); // Вывод: 'Привет, мир!'
    

    Параметры и возвращаемые значения

    Функции могут принимать параметры (значения, передаваемые при вызове) и возвращать значения с использованием ключевого слова return.

    Пример с параметрами и возвращаемым значением:

    function sum(a, b) {
      return a + b;
    }
    
    let result = sum(5, 3);
    console.log(result); // Вывод: 8
    

    Стрелочные функции (Arrow Functions)

    Стрелочные функции представляют сокращенный синтаксис для объявления функций

    Пример стрелочной функции:

    let sayHi = () => {
      console.log('Привет, мир!');
    };
    
    sayHi(); // Вывод: 'Привет, мир!'
    

    Предположим, у вас есть функция, которая возводит число x в степень n >= 1. Эта функция может быть переиспользована в различных частях вашего кода, где вам нужно произвести такое преобразование

    function pow(x, n) {
      if (n < 1) {
        return false;
      }
    
      let result = 1;
      for (let i = 0; i < n; i++) {
        result = result * x;
      }
    
      return result;
    }
    
    1. Если значение n меньше 1, функция возвращает false. Это предостережение от некорректных входных данных, так как функция предназначена для работы с положительными степенями.
    2. Переменная result инициализируется значением 1. Это начальное значение, и в нее будет поочередно умножаться число x
    3. Цикл for выполняется от 0 до n - 1. На каждом шаге цикла значение result умножается на x. Таким образом, на выходе из цикла переменная result содержит значение x в степени n.
    4. Функция возвращает значение переменной result как результат возведения в степень.

    Теперь мы можем возводить число в степень с помощью этой функции

    console.log(pow(5, 3)); // Вывод: 125
    console.log(pow(6, 5)); // Вывод: 7776
    

    Объекты

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

    Создадим объект "Коробка для игрушек"

    let toyBox = {
      color: 'красный',
      size: 'средний',
      toys: ['мяч', 'кукла', 'машина'],
      isOpen: false,
      open: function () {
        this.isOpen = true;
        console.log('Коробка открыта!');
      },
    };
    

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

    console.log(toyBox.color); // Вывод: 'красный'
    console.log(toyBox['color']); // Вывод: 'красный'
    

    Так же мы можем изменять значения объекта:

    toyBox.color = 'синий';
    toyBox.toys.push('кубики');
    toyBox.open(); // Вывод: 'Коробка открыта!'
    

    И теперь наша коробка с игрушками будет выглядить так:

    {
      color: 'синий',
      size: 'средний',
      toys: ['мяч', 'кукла', 'машина', 'кубики'],
      isOpen: true,
      open: function() {
        this.isOpen = true;
        console.log('Коробка открыта!');
      }
    }
    

    this - это ключевое слово, которое указывает на текущий контекст выполнения кода, или, другими словами, на объект, который вызывает метод. В контексте метода open, this ссылается на объект toyBox, потому что метод вызывается на этом объекте.

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

    Метод open в объекте выполняет две важные вещи:

    1. this.isOpen = true говорит о том, что мы устанавливаем состояние коробки в открытое.
    2. console.log('Коробка открыта!') просто выводит сообщение "Коробка открыта!" в консоль браузера или среды выполнения JavaScript.

    Цикл for..in

    Для перебора всех свойств объекта используется цикл for..in. Этот цикл отличается от изученного ранее цикла for(;;).

    К примеру, выведем все свойства ранее созданного объекта toyBox2:

    let toyBox2 = {
      color: 'красный',
      size: 'средний',
      toys: ['мяч', 'кукла', 'машина'],
    };
    
    for (let key in toyBox) {
      // ключи
      console.log(key); //  color, size, toys
      // значения ключей
      console.log(toyBox[key]); // красный, средний, ["мяч", "кукла", "машина"]
    }
    

    Обработка ошибок и отладка в JavaScript

    JavaScript, как и любой другой язык программирования, подразумевает работу с ошибками и их отладку. Это важная часть процесса разработки, которая помогает создавать более стабильные и надежные приложения. В этом блоке статьи мы рассмотрим два основных аспекта обработки ошибок и отладки в JavaScript: использование try-catch блоков.

    Использование try-catch блоков

    Одним из основных методов обработки ошибок в JavaScript является использование конструкции try-catch. Этот механизм позволяет попытаться выполнить определенный блок кода, и, если в процессе возникает ошибка, перехватить её и выполнить альтернативный блок кода в блоке catch.

    Пример:

    try {
      // Блок кода, который может вызвать ошибку
      let result = invalidFunction(); // Функция, которая вызывает ошибку
      console.log(result); // Этот код не выполнится при ошибке в предыдущей строке
    } catch (error) {
      // Блок кода для обработки ошибки
      console.error('Произошла ошибка:', error.message); // Выводит сообщение об ошибке
    } finally {
      // Блок кода, который выполняется в любом случае
      console.log('Этот код выполнится всегда');
    }
    

    Заключение

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

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

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

    Начните свое увлекательное путешествие в мир программирования с JavaScript уже сегодня!

    Иконка глаза10 017

    Комментарии

    0

    Постройте личный план изучения JavaScript с нуля - основы языка и практика для начинающих до уровня Middle — бесплатно!

    JavaScript с нуля - основы языка и практика для начинающих — часть карты развития Frontend, Backend, Mobile

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Продвинутый JavaScript

    Антон Ларичев
    AI-тренажеры
    Практика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    TypeScript с нуля

    Антон Ларичев
    AI-тренажеры
    Практика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Neovim

    Антон Ларичев
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    Иконка чипа0