Создание новых объектов
JavaScript содержит набор встроенных объектов. Также вы можете создавать свои объекты. Начиная с JavaScript 1.2, вы можете создавать объект с помощью инициализатора объекта. Другой способ — создать функцию-конструктор и сделать экземпляр объекта с помощью этой функции и оператора .
Помимо создания объектов с помощью функции-конструктора вы можете создавать объекты и другим, особым способом. Фактически, вы можете записать объект синтаксически, и он будет создан интерпретатором автоматически во время выполнения. Эта синтаксическая схема приведена ниже:
здесь — это имя нового объекта, каждое — это идентификатор (имя, число или строковый литерал), и каждый — это значения, назначенные . Имя и ссылка объекта на него необязательна; если далее вам не надо будет ссылаться на данный объект, то вам не обязательно назначать объект переменной
(Обратите внимание, что вам потребуется обернуть литерал объекта в скобки, если объект находится в месте, где ожидается инструкция, чтобы интерпретатор не перепутал его с блоком.)
Если объект создан при помощи инициализатора объектов на высшем уровне скрипта, то JavaScript интерпретирует объект каждый раз, когда анализирует выражение, содержащее объект, записанный как литерал. Плюс, если пользоваться функцией инициализатором, то он будет создаваться каждый раз, когда функция вызывается.
Следующая инструкция создаёт объект и назначает его переменной , когда выражение истинно.
Следующий пример создаёт объект с тремя свойствами. Заметьте, что свойство — это также объект со своими собственными свойствами.
Вы также можете использовать инициализатор объекта для создания массивов. Смотрите .
До JavaScript 1.1 не было возможности пользоваться инициализаторами объекта. Единственный способ создавать объекты — это пользоваться функциями-конструкторами или функциями других объектов, предназначенных для этой цели. Смотрите .
Другой способ создать объект в два шага описан ниже:
- Определите тип объекта, написав функцию-конструктор. Название такой функции, как правило, начинается с заглавной буквы.
- Создайте экземпляр объекта с помощью ключевого слова .
Чтобы определить тип объекта создайте функцию, которая определяет тип объекта, его имя, свойства и методы. Например предположим, что вы хотите создать тип объекта для описания машин. Вы хотите, чтобы объект этого типа назывался , и вы хотите, чтобы у него были свойства make, model, и year. Чтобы сделать это, напишите следующую функцию:
Заметьте, что используется чтобы присвоить значения (переданные как аргументы функции) свойствам объекта.
Теперь вы можете создать объект, называемый , следующим образом:
Эта инструкция создаёт объект типа Car со ссылкой и присваивает определённые значения его свойствам. Значением станет строка «Eagle», — это целое число 1993, и так далее.
Вы можете создать столько объектов сколько нужно, просто вызывая . Например:
Объект может иметь свойство, которое будет другим объектом. Например, далее определяется объект типа следующим образом:
и затем создать два новых экземпляра объектов как показано далее:
Затем, вы можете переписать определение и включить в него свойство , которому назначить объект следующим образом:
Затем, чтобы создать экземпляры новых объектов, выполните следующие инструкции:
Заметьте, что вместо того, чтобы передавать строку, литерал или целое число при создании новых объектов, в выражениях выше передаются объекты и как аргумент функции. Теперь, если вам нужно узнать имя владельца car2, это можно сделать следующим образом:
Заметьте, что в любое время вы можете добавить новое свойство ранее созданному объекту. Например, выражение
добавляет свойство к car1, и устанавливает его значение равным «black.» Как бы там ни было, это не влияет на любые другие объекты. Чтобы добавить новое свойство всем объектам одного типа, вы должны добавить свойство в определение типа объекта .
Объекты также можно создавать с помощью метода . Этот метод очень удобен, так как позволяет вам указывать объект прототип для нового вашего объекта без определения функции конструктора.
Квадратные скобки
Для свойств, имена которых состоят из нескольких слов, доступ к значению «через точку» не работает:
JavaScript видит, что мы обращаемся к свойству , а затем идёт непонятное слово . В итоге синтаксическая ошибка.
Точка требует, чтобы ключ был именован по правилам именования переменных. То есть не имел пробелов, не начинался с цифры и не содержал специальные символы, кроме и .
Для таких случаев существует альтернативный способ доступа к свойствам через квадратные скобки. Такой способ сработает с любым именем свойства:
Сейчас всё в порядке
Обратите внимание, что строка в квадратных скобках заключена в кавычки (подойдёт любой тип кавычек)
Квадратные скобки также позволяют обратиться к свойству, имя которого может быть результатом выражения. Например, имя свойства может храниться в переменной:
Здесь переменная может быть вычислена во время выполнения кода или зависеть от пользовательского ввода. После этого мы используем её для доступа к свойству. Это даёт нам большую гибкость.
Пример:
Запись «через точку» такого не позволяет:
Мы можем использовать квадратные скобки в литеральной нотации для создания вычисляемого свойства.
Пример:
Смысл вычисляемого свойства прост: запись означает, что имя свойства необходимо взять из переменной .
И если посетитель введёт слово , то в объекте теперь будет лежать свойство .
По сути, пример выше работает так же, как и следующий пример:
…Но первый пример выглядит лаконичнее.
Мы можем использовать и более сложные выражения в квадратных скобках:
Квадратные скобки дают намного больше возможностей, чем запись через точку. Они позволяют использовать любые имена свойств и переменные, хотя и требуют более громоздких конструкций кода.
Подведём итог: в большинстве случаев, когда имена свойств известны и просты, используется запись через точку. Если же нам нужно что-то более сложное, то мы используем квадратные скобки.
insertAdjacentHTML/Text/Element
С этим может помочь другой, довольно универсальный метод: .
Первый параметр – это специальное слово, указывающее, куда по отношению к производить вставку. Значение должно быть одним из следующих:
- – вставить непосредственно перед ,
- – вставить в начало ,
- – вставить в конец ,
- – вставить непосредственно после .
Второй параметр – это HTML-строка, которая будет вставлена именно «как HTML».
Например:
…Приведёт к:
Так мы можем добавлять произвольный HTML на страницу.
Варианты вставки:
Мы можем легко заметить сходство между этой и предыдущей картинкой. Точки вставки фактически одинаковые, но этот метод вставляет HTML.
У метода есть два брата:
- – такой же синтаксис, но строка вставляется «как текст», вместо HTML,
- – такой же синтаксис, но вставляет элемент .
Они существуют, в основном, чтобы унифицировать синтаксис. На практике часто используется только . Потому что для элементов и текста у нас есть методы – их быстрее написать, и они могут вставлять как узлы, так и текст.
Так что, вот альтернативный вариант показа сообщения:
Большинство методов поддерживают «thisArg»
Почти все методы массива, которые вызывают функции – такие как , , , за исключением метода , принимают необязательный параметр .
Этот параметр не объяснялся выше, так как очень редко используется, но для наиболее полного понимания темы мы обязаны его рассмотреть.
Вот полный синтаксис этих методов:
Значение параметра становится для .
Например, вот тут мы используем метод объекта как фильтр, и передаёт ему контекст:
Если бы мы в примере выше использовали просто , то вызов был бы в режиме отдельной функции, с . Это тут же привело бы к ошибке.
Вызов можно заменить на , который делает то же самое. Последняя запись используется даже чаще, так как функция-стрелка более наглядна.
Удаление элементов массива
Методы pop() и shift()
Методы pop() и shift() удаляют последний и первый элемент массива, соответственно:
var myArray = ; myArray.pop(); // Удаляет элемент "Кейт" myArray.shift(); // Удаляет элемент "Джек" console.log(myArray); // Выводит
Метод splice()
С помощью метода splice() можно удалять или добавлять элементы в массив, при этом точно указывая индекс элементов.
В следующем примере метод splice() добавляет два элемента, начиная с индекса 2 (то есть с третьего элемента):
var fruitArray = ; fruitArray.splice(2, 0, "дыня", "банан"); console.log(fruitArray); // Выводит
Первый параметр метода splice() — индекс. Он указывает, на какой позиции нужно добавить/удалить элементы. В нашем примере мы выбрали индекс 2 (со значением «апельсин»).
Второй параметр — количество элементов, которые требуется удалить. Мы указали значение 0, поэтому ничего не удалится.
Следующие параметры — необязательные. Они добавляют в массив новые значения. В нашем случае нужно добавить «дыню» и «банан», начиная с индекса 2.
Чтобы удалить один элемент массива js на индексе 2, нужен следующий код:
var fruitArray = ; fruitArray.splice(2,1); console.log(fruitArray); // Prints
Стоит также сказать о методе slice(), который тоже удаляет значения из массива, но не изменяет оригинальный массив, а возвращает новый.
Пожалуйста, оставьте ваши комментарии по текущей теме материала. За комментарии, подписки, дизлайки, лайки, отклики огромное вам спасибо!
МКМихаил Кузнецовавтор-переводчик статьи «Work with JavaScript arrays like a boss»
Добавление/удаление элементов
Мы уже знаем методы, которые добавляют и удаляют элементы из начала или конца:
- – добавляет элементы в конец,
- – извлекает элемент из конца,
- – извлекает элемент из начала,
- – добавляет элементы в начало.
Есть и другие.
Как удалить элемент из массива?
Так как массивы – это объекты, то можно попробовать :
Вроде бы, элемент и был удалён, но при проверке оказывается, что массив всё ещё имеет 3 элемента .
Это нормально, потому что всё, что делает – это удаляет значение с данным ключом . Это нормально для объектов, но для массивов мы обычно хотим, чтобы оставшиеся элементы сдвинулись и заняли освободившееся место. Мы ждём, что массив станет короче.
Поэтому для этого нужно использовать специальные методы.
Метод arr.splice(str) – это универсальный «швейцарский нож» для работы с массивами. Умеет всё: добавлять, удалять и заменять элементы.
Его синтаксис:
Он начинает с позиции , удаляет элементов и вставляет на их место. Возвращает массив из удалённых элементов.
Этот метод проще всего понять, рассмотрев примеры.
Начнём с удаления:
Легко, правда? Начиная с позиции , он убрал элемент.
В следующем примере мы удалим 3 элемента и заменим их двумя другими.
Здесь видно, что возвращает массив из удалённых элементов:
Метод также может вставлять элементы без удаления, для этого достаточно установить в :
Отрицательные индексы разрешены
В этом и в других методах массива допускается использование отрицательного индекса. Он позволяет начать отсчёт элементов с конца, как тут:
Метод arr.slice намного проще, чем похожий на него .
Его синтаксис:
Он возвращает новый массив, в который копирует элементы, начиная с индекса и до (не включая ). Оба индекса и могут быть отрицательными. В таком случае отсчёт будет осуществляться с конца массива.
Это похоже на строковый метод , но вместо подстрок возвращает подмассивы.
Например:
Можно вызвать и вообще без аргументов: создаёт копию массива . Это часто используют, чтобы создать копию массива для дальнейших преобразований, которые не должны менять исходный массив.
Метод arr.concat создаёт новый массив, в который копирует данные из других массивов и дополнительные значения.
Его синтаксис:
Он принимает любое количество аргументов, которые могут быть как массивами, так и простыми значениями.
В результате мы получаем новый массив, включающий в себя элементы из , а также , и так далее…
Если аргумент – массив, то все его элементы копируются. Иначе скопируется сам аргумент.
Например:
Обычно он просто копирует элементы из массивов. Другие объекты, даже если они выглядят как массивы, добавляются как есть:
…Но если объект имеет специальное свойство , то он обрабатывается как массив: вместо него добавляются его числовые свойства.
Для корректной обработки в объекте должны быть числовые свойства и :
Нестандартные атрибуты, dataset
При написании HTML мы используем много стандартных атрибутов. Но что насчёт нестандартных, пользовательских? Давайте посмотрим, полезны они или нет, и для чего они нужны.
Иногда нестандартные атрибуты используются для передачи пользовательских данных из HTML в JavaScript, или чтобы «помечать» HTML-элементы для JavaScript.
Как тут:
Также они могут быть использованы, чтобы стилизовать элементы.
Например, здесь для состояния заказа используется атрибут :
Почему атрибут может быть предпочтительнее таких классов, как , , ?
Это потому, что атрибутом удобнее управлять. Состояние может быть изменено достаточно просто:
Но с пользовательскими атрибутами могут возникнуть проблемы. Что если мы используем нестандартный атрибут для наших целей, а позже он появится в стандарте и будет выполнять какую-то функцию? Язык HTML живой, он растёт, появляется больше атрибутов, чтобы удовлетворить потребности разработчиков. В этом случае могут возникнуть неожиданные эффекты.
Чтобы избежать конфликтов, существуют атрибуты вида .
Все атрибуты, начинающиеся с префикса «data-», зарезервированы для использования программистами. Они доступны в свойстве .
Например, если у есть атрибут , то обратиться к нему можно как .
Как тут:
Атрибуты, состоящие из нескольких слов, к примеру , становятся свойствами, записанными с помощью верблюжьей нотации: .
Вот переписанный пример «состояния заказа»:
Использование атрибутов – валидный, безопасный способ передачи пользовательских данных.
Пожалуйста, примите во внимание, что мы можем не только читать, но и изменять data-атрибуты. Тогда CSS обновит представление соответствующим образом: в примере выше последняя строка меняет цвет на синий
Самые красивые шахматы для 1С на управляемых формах
Здравствуйте, представляем Вашему вниманию классическую игру – Шахматы! Написана игра средствами 1С, на управляемых формах. Программный код представляет собой с аккуратностью составленную систему, содержащую лаконичные логические приемы и описательные имена переменных, объектов и функций. Программа полностью отлажена и многократно протестирована. Оригинальный авторский дизайн фигур, иконок и кнопок приятен глазу. Игра содержит большое количество функций, настроек и режимов игры, включая сетевую игру, тренировку с ботом или игру на двоих. Не упустите возможность найти ряд технических решений, применимых для реализации различных задач, а также поиграть в вечную игру с отличным оформлением! Желающие научиться программировать на управляемых формах могут многое почерпнуть в этой конфигурации.
5 стартмани
Точечная запись (Dot notation)
Выше вы получили доступ к свойствам и методам используя точечную запись (dot notation). Имя объекта (person) действует как пространство имён (namespace) — оно должно быть введено первым, для того чтобы получить доступ ко всему что заключено (encapsulated) внутри объекта. Далее вы пишете точку, затем элемент, к которому хотите получить доступ — это может быть имя простого свойства, элемент массива, или вызов одного из методов объекта, например:
Можно даже сделать значением элемента объекта другой объект. Например, попробуйте изменить значение свойства name с такого
на такое
Здесь мы фактически создаём внутреннее пространство имён (sub-namespace). Это звучит сложно, но на самом деле это не так — для доступа к этим элементам вам нужно сделать один дополнительный шаг с ещё одной точкой. Попробуйте в консоли браузера следующее:
Важно: На этом этапе вам также нужно будет пересмотреть код метода и изменить все экземпляры с
на
Иначе ваши методы больше не будут работать.
Синхронизация между атрибутами и свойствами
Когда стандартный атрибут изменяется, соответствующее свойство автоматически обновляется. Это работает и в обратную сторону (за некоторыми исключениями).
В примере ниже модифицируется как атрибут, и можно увидеть, что свойство также изменено. То же самое работает и в обратную сторону:
Но есть и исключения, например, синхронизируется только в одну сторону – атрибут → значение, но не в обратную:
В примере выше:
- Изменение атрибута обновило свойство.
- Но изменение свойства не повлияло на атрибут.
Иногда эта «особенность» может пригодиться, потому что действия пользователя могут приводить к изменениям , и если после этого мы захотим восстановить «оригинальное» значение из HTML, оно будет в атрибуте.
Объекты и свойства
В JavaScript объект имеет свойства, ассоциированные с ним. Свойство объекта можно понимать как переменную, закреплённую за объектом. Свойства объекта в сущности являются теми же самыми переменными JavaScript, за тем исключением, что они закреплены за объектом. Свойства объекта определяют его характеристики. Получить доступ к свойству объекта можно с помощью точечной записи:
Как и все переменные JavaScript, имя объекта (которое тоже может быть переменной) и имя свойства являются чувствительными к регистру. Вы можете определить свойство указав его значение. Например, давайте создадим объект и определим его свойства , , и следующим образом:
Неопределённые свойства объекта являются (а не ).
Свойства объектов JavaScript также могут быть доступны или заданы с использованием скобочной записи (более подробно см. property accessors). Объекты иногда называются ассоциативными массивами, поскольку каждое свойство связано со строковым значением, которое можно использовать для доступа к нему. Так, например, вы можете получить доступ к свойствам объекта следующим образом:
Имена свойств объекта могут быть строками JavaScript, или тем, что может быть сконвертировано в строку, включая пустую строку. Как бы то ни было, доступ к любому имени свойства, которое содержит невалидный JavaScript идентификатор (например, имя свойства содержит в себе пробел и тире или начинается с цифры), может быть получен с использованием квадратных скобок. Этот способ записи также полезен, когда имена свойств должны быть динамически определены (когда имя свойства не определено до момента исполнения). Примеры далее:
Обратите внимание, что все ключи с квадратными скобками преобразуются в тип String, поскольку объекты в JavaScript могут иметь в качестве ключа только тип String. Например, в приведённом выше коде, когда ключ добавляется в , JavaScript вызывает метод и использует эту результирующую строку в качестве нового ключа
Вы также можете получить доступ к свойствам, используя значение строки, которое хранится в переменной:
Вы можете пользоваться квадратными скобками в конструкции чтобы выполнить итерацию всех свойств объекта, для которых она разрешена. Чтобы показать как это работает, следующая функция показывает все свойства объекта, когда вы передаёте в неё сам объект и его имя как аргументы функции:
Так что если вызвать эту функцию вот так то получим результат:
Резюме
Поздравляем, вы достигли конца нашей первой статьи о объектах JS, теперь у вас должно быть хорошее представление о том, как работать с объектами в JavaScript — в том числе создавать свои собственные простые объекты. Вы также должны понимать, что объекты очень полезны в качестве структур для хранения связанных данных и функциональности — если бы мы пытались отслеживать все свойства и методы в нашем объекте как отдельные переменные и функции, это было неэффективно, и мы бы рисковали столкнуться с другими переменными и функциями с такими же именами. Объекты позволяют нам безопасно хранить информацию в своём собственном блоке, вне опасности.
В следующей статье мы начнём рассматривать теорию объектно-ориентированного программирования (ООП) и как эти техники могут быть использованы в JavaScript
- Обзор: Objects
- Далее
Как скопировать элемент в jQuery
Копирование одного или нескольких элементов в jQuery осуществляется с помощью метода .
Синтаксис метода :
.clone ( )
Параметры и являются необязательными. По умолчанию первый параметр равен , а второй равен значению первого.
Первый параметр указывает, следует ли копировать обработчики событий и данные вместе с элементами.
Второй параметр делает аналогичные действия, но не для самого клонированного элемента, а для всех его дочерних элементов.
Примеры использования метода clone.
1. При нажатии на элемент будем его клонировать, после чего вставлять скопированный элемент в конец.
<div class="items" style="display: flex; flex-wrap: wrap"> <div class="item" style="height: 100px; width: 100px; background-color: #eee; font-size: 50px; text-align: center; line-height: 100px; cursor: pointer; margin: 5px;">1</div> </div> <script> $('.item').click(function() { var clone = $(this).clone(), // копируем элемент на который мы кликнули count = $('.item').length; // определяем количество элементов .item $('.items').append(clone.text(count + 1)); // добавляем элемент в конец элемента .items, при этом изменяем его содержимое на count + 1 }); </script>
Немного усовершенствуем скрипт. Укажем, что при клонировании элемента нужно копировать и его события. Для этого установим параметру значение .
clone = $(this).clone(true), // копируем элемент на который мы кликнули
2. Пример, в котором будем копировать элемент, содержащий другие элементы, на один из которых «повешен» обработчик события.
<div class="form-group"> <label> <span>Товар:</span> <input type="text"> <button class="addProduct">Добавить ещё товар</button> </label> </div> <script> $('.addProduct').click(function() { var formGroup = $(this).closest('.form-group'), product = formGroup.clone(true, true); formGroup.after(product); }); </script>
Вывод массива с объектами
Разница между обычным массивом и массивом объектов не столь уж велика. Просто добавляется, как правило, точечный синтаксис при обращении к свойствам каждого объекта внутри массива. Например, мы можем сформировать нумерованный список при выводе информации о каждом объекте массива:
Вывод информации из массива объектов
JavaScript
let animals = ;
document.write(‘<ol start=»0″>’);
animals.forEach( animal => {
document.write(`<li>${animal.type} <span style=»color: #1a55cc»>${animal.name}</span>
is ${animal.age} years old.</li>`);
});
document.write(‘<ol>’);
1 |
let animals= {name’Vasya’,type’Cat’,age4}, {name’Murka’,type’Cat’,age1.5}, {name’Varna’,type’Turtle’,age21}, {name’Kesha’,type’Parrot’,age3}, {name’Nayda’,type’Dog’,age2.5}, {name’Pufic’,type’Humster’,age2.5}, {name’Randy’,type’dog’,age12}, ; document.write(‘<ol start=»0″>’); animals.forEach(animal=>{ document.write(`<li>${animal.type}<span style=»color: #1a55cc»>${animal.name}<span> is${animal.age}years old.<li>`); }); document.write(‘<ol>’); |
Нумерация списка начинается с нуля, для того чтобы сразу был понятен реальный индекс элемента в массиве. Имя животного выводится, как , его вид — как , а его возраст — как . Имя выделено другим цветом.
Итого
Объекты – это ассоциативные массивы с рядом дополнительных возможностей.
Они хранят свойства (пары ключ-значение), где:
- Ключи свойств должны быть строками или символами (обычно строками).
- Значения могут быть любого типа.
Чтобы получить доступ к свойству, мы можем использовать:
- Запись через точку: .
- Квадратные скобки . Квадратные скобки позволяют взять ключ из переменной, например, .
Дополнительные операторы:
- Удаление свойства: .
- Проверка существования свойства: .
- Перебор свойств объекта: цикл for .
То, что мы изучали в этой главе, называется «простым объектом» («plain object») или просто .
В JavaScript есть много других типов объектов:
- для хранения упорядоченных коллекций данных,
- для хранения информации о дате и времени,
- для хранения информации об ошибке.
- … и так далее.
У них есть свои особенности, которые мы изучим позже. Иногда люди говорят что-то вроде «тип данных Array» или «тип данных Date», но формально они не являются отдельными типами, а относятся к типу данных . Они лишь расширяют его различными способами.
Объекты в JavaScript очень мощные. Здесь мы только немного углубились в действительно огромную тему. Мы будем плотно работать с объектами и узнаем о них больше в следующих частях учебника.
Вывод массива объектов с использованием цикла for … in
Предположим, что нам нужно вывести ряд html-элементов, например, абзацев, с различным css-форматированием, причем набор правил и текст мы получаем в виде массива объектов. Чаще всего каждый объект в таком массиве имеет набор полей, которые идут в строго определенном порядке, но, предположим, наш массив формировал неопытный студент вручную, поэтому в объектах поля следуют по-разному.
Если посмотреть на названия свойств (полей), то можно заметить, что только свойство text не относится к css-свойствам. Все же остальные и по названию свойства, и по значению относятся к правилам css. Поэтому проще всего собрать css-свойства в одну строку, которая в приведенном ниже скрипте является переменной , а затем добавить ее в качестве значения атрибута style для абзаца. С этим нам поможет справится замечательный цикл for…in. Есть только одно но — нам нельзя в css-свойства записать свойство text объекта, поэтому напишем для этой ситуации проверку с помощью и пропустим добавление текста к с помощью оператора циклов .
Вывод отформатированных абзацев
JavaScript
const data = ;
data.forEach(item =>{
let styleStr = »;
for(key in item){
if(key == ‘text’) continue;
styleStr+= key+’:’+item+’;’;
}
//document.write(`<p style=»color: ${item.color};font-weight: ${item}; padding: ${item}; border: ${item.border} «>${item.text}</p>`);
document.write(`<p style=»${styleStr}»>${item.text}</p>`);
})
1 24 |
constdata= { color’green’, ‘font-weight»bold’, padding’10px’, border’4px dashed #50e690′, text’Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet, libero. Dolor porro, ipsum reprehenderit. ‘ }, { color’#1c3dc7′, text’Ducimus temporibus laboriosam tempora dolorem laborum eligendi cumque adipisci in, vel, quaerat repellat necessitatibus explicabo.’, ‘font-weight»normal’, padding’15px’, border’3px double #57abff’, }, ; data.forEach(item=>{ let styleStr=»; for(key initem){ if(key==’text’)continue; styleStr+=key+’:’+itemkey+’;’; } document.write(`<pstyle=»${styleStr}»>${item.text}<p>`); }) |
Обратите внимание, насколько длиннее строка 23, в которой мы записали все свойства без использования цикла и подумайте, насколько больше шансов допустить в ней ошибку по сравнению с использованием цикла. Результат работы скрипта:
Результат работы скрипта: