JavaScript для детей — страница 12 из 48

landmarks.push("Пожарная станция");

landmarks.push("Приют для кошек");

landmarks.push("Моя бывшая школа");

landmarks.push("Дом подруги");

Здесь мы создали пустой массив landmarks и методом push сохра-

Landmarks —

нили в нем все ориентиры, замеченные по дороге к дому подруги.

заметные

объекты

Движемся в обратном порядке с помощью pop

Вы добрались до дома подруги, и можно изучить массив ориентиров.

Разумеется, первым стоит "Мой дом", потом "Дорожка к дому", и т. д.

до конца массива, где находится элемент "Дом подруги". Теперь, когда

наступит время идти домой, вам останется лишь изымать из массива

по одному элементу, и всегда будет понятно, куда идти дальше.

3. Массивы 63

landmarks.pop();

"Дом подруги"

landmarks.pop();

"Моя бывшая школа"

landmarks.pop();

"Приют для кошек"

landmarks.pop();

"Пожарная станция"

landmarks.pop();

"Протекающий гидрант"

landmarks.pop();

"Мигающий фонарь"

landmarks.pop();

"Дорожка к дому"

landmarks.pop();

"Мой дом"

Вот вы и дома!

Заметили, что первый ориентир, который вы поместили

в массив методом push, оказался также последним, который

вы извлекли методом pop? А последний добавленный ориентир

оказался первым извлеченным? Может показаться, что лучше

бы первый добавленный элемент и извлекался всегда первым,

однако извлекать элементы в обратном порядке в некоторых

случаях удобно.

Такой подход нередко используется в больших програм-

мах — именно поэтому push и pop в JavaScript всегда под

рукой.

! Среди программистов такой способ работы с элементами называ-

ется «стек». Представьте, что стек — это стопка блинов. Всякий

раз, когда готов новый блин, его кладут сверху стопки (как метод

push ), и, когда вы берете блин, чтобы его съесть, вы тоже берете

его сверху (как метод pop ). Снятие элементов со стека похоже

на путешествие назад во времени: последним изымается эле-

мент, который был в стеке первым. То же происходит с блинами:

последний блин, который вы съедите, — это первый, который был

приготовлен. На сленге программистов этот способ называется

«последним вошел, первым вышел», английская аббревиатура LIFO

(last in, fi rst out). Есть и альтернативный подход — «первым вошел,

первым вышел», аббревиатура FIFO (fi rst in, fi rst out). Его также

называют очередью, поскольку таким же образом устроены оче-

реди — первый человек, вставший в очередь, будет первым, кото-

рого обслужат.

64 Часть I. Основы

Случайный выбор

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

ные варианты из заданного списка (наподобие «шара судьбы»). Однако

сначала нужно разобраться, откуда нам брать случайные числа.

Использование Math.random()

Случайные числа можно генерировать с помощью специального метода

Math.random(), который при каждом вызове возвращает случайное Math random —

число от 0 до 1:

случайное

число

Math.random();

0.8945409457664937

Math.random();

0.3697543195448816

Math.random();

0.48314980138093233

Важно помнить, что Math.random() всегда возвращает число

меньше 1, то есть никогда не возвращает собственно 1.

Если вам нужно число побольше, просто умножьте полученное из ме-

тода Math.random() значение на подходящий коэффициент. Например,

если нужно случайное число от 0 до 10, умножьте Math.random() на 10:

Math.random() * 10;

7.648027329705656

Math.random() * 10;

9.7565904534421861

Math.random() * 10;

0.21483442978933454

Округление с помощью Math.fl oor()

И все же эти случайные значения нельзя использовать как индексы

в массиве, поскольку индексы должны быть целыми числами, а не деся-

тичными дробями. Чтобы исправить этот недостаток, нужен метод

Math.fl oor(), округляющий число до ближайшего снизу целого значе-

Math floor —

ния (по сути, он просто отбрасывает все знаки после запятой).

целая часть

числа

Math.floor(3.7463463);

3

Math.floor(9.9999);

9

Math.floor(0.793423451963426);

0

3. Массивы 65

Давайте используем оба метода, чтобы получить случайный индекс.

Нужно лишь умножить Math.random() на длину массива и затем округ-

лить полученное число методом Math.fl oor(). Например, если в массиве

четыре элемента, это можно сделать так:

Math.floor(Math.random() * 4);

2 // может выпасть 0, 1, 2 или 3

При каждом запуске этот код будет возвращать случайное число от 0

до 3 (включая 0 и 3). Поскольку Math.random() всегда возвращает значе-

ние меньше 1, Math.random() * 4 никогда не вернет 4 или большее число.

Используя это случайное число как индекс, можно получить случай-

ный элемент массива:

var randomWords = ["Взрыв", "Пещера", "Принцесса", "Карандаш"]; Random

var randomIndex = Math.floor(Math.random() * 4);

words —

randomWords[randomIndex];

случайные

"Пещера"

слова

Random index —

случайный

С помощью Math.fl oor(Math.random() * 4); мы получили случай-

индекс

ное число от 0 до 3. Сохранив это число в переменной randomIndex, мы

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

В сущности, можно сделать этот код короче, избавившись от пере-

менной randomIndex:

randomWords[Math.floor(Math.random() * 4)];

"Принцесса"

Программа случайного выбора вариантов

Теперь давайте создадим массив с фразами, чтобы случайным образом

выбирать их с помощью написанного ранее кода. Это и будет наш ком-

пьютерный «шар судьбы»! В комментариях указаны примеры вопросов,

которые можно задать нашей программе.

var phrases = [

Phrases —

"Звучит неплохо",

фразы

"Да, это определенно надо сделать",

"Не думаю, что это хорошая идея",

"Может, не сегодня?",

"Компьютер говорит нет"

];

// Мне выпить еще молочного коктейля?

66 Часть I. Основы

phrases[Math.floor(Math.random() * 5)];

"Не думаю, что это хорошая идея"

// Мне пора делать домашнюю работу?

phrases[Math.floor(Math.random() * 5)];

"Может, не сегодня?”

Мы создали массив phrases, в котором хранятся различные советы.

Теперь, придумав вопрос, можно запросить случайный элемент из мас-

сива phrases, и полученный совет поможет принять решение!

Обратите внимание: поскольку в массиве с советами пять элементов,

мы умножаем Math.random() на 5. Таким образом, мы всегда получим

одно из пяти значений индекса: 0, 1, 2, 3 или 4.

Генератор случайных дразнилок

Можно усовершенствовать код выбора вариантов, создав программу,

которая при каждом запуске генерирует случайную дразнилку!

var randomBodyParts = ["глаз", "нос", "череп"];


Random

var randomAdjectives = ["вонючая", "унылая", "дурацкая"];

body part —

var randomWords = ["муха", "выдра", "дубина", "мартышка", "крыса"]; случайная

// Выбор случайной части тела из массива randomBodyParts:

часть тела

 var randomBodyPart = randomBodyParts[Math.floor(Math.random() * 3)];

// Выбор случайного прилагательного из массива randomAdjectives:

Random

 var randomAdjective = randomAdjectives[Math.floor(Math.random() * 3)];

adjective —

// Выбор случайного слова из массива randomWords:

случайное

прилагатель-

var randomWord = randomWords[Math.floor(Math.random() * 5)];

ное

// Соединяем случайные строки в предложение:

var randomInsult = "У тебя " + randomBodyPart + " словно " + 


Random

randomAdjective + " " + randomWord + "!!!";

insult —

randomInsult;

случайная

"У тебя нос словно дурацкая выдра!!!"

дразнилка

У нас есть три массива со словами, и в стро-

ках ,  и  мы с помощью трех индек-

сов берем из каждого массива по случай-

ному слову. Затем мы склеиваем их, помещая

результат в переменную randomInsult, —

это и есть готовая дразнилка. В строках 

и мы используем множитель 3, поскольку

и в randomAdjective, и в randomBodyPart

по три элемента. Аналогично в строке  мы

умножаем на 5, ведь в randomWords пять

элементов. Обратите внимание, что мы доба-

вили между randomAdjective и randomWord

3. Массивы 67

строку с единственным пробелом. Запустите этот код несколько раз —

при каждом запуске получится новая случайная дразнилка!

ПОПР ОБУ ЙТЕ !

Если хотите сделать все действительно по-умному, замените строку 

на вот такую:

var randomWord = randomWords[Math.floor(Math.random() * 

randomWords.length)];

В этой программе всегда нужно умножать Math.random() на длину

массива; использование randomWords.length как множителя означает,

что нам не понадобится менять этот код, если длина массива изменится.

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

var randomInsult = ["У тебя", randomBodyPart, "словно", 

randomAdjective, randomWord + "!!!"].join(" ");

"У тебя череп словно дурацкая дубина!!!"

В этом варианте каждое слово дразнилки — это отдельный эле-

мент массива, и мы соединяем все эти элементы методом join с раз-

делителем-пробелом. Лишь в одном случае пробел не нужен — между

randomWord и «!!!». В этом случае мы используем оператор +, чтобы сое-

динить строки без пробела.

Что мы узнали

Как мы теперь знаем, массивы JavaScript предназначены для хранения