var string = "abc";
console.log(string.length);
// → 3
console.log(string.charAt(0));
// → a
console.log(string[1]);
// → b
Объект arguments
Когда вызывается функция, к окружению исполняемого тела функции добавляется особая переменная под названием arguments. Она указывает на объект, содержащий все аргументы, переданные функции. Помните, что в JavaScript вы можете передавать функции больше или меньше аргументов, чем объявлено при помощи параметров.
function noArguments() {}
noArguments(1, 2, 3); // Пойдёт
function threeArguments(a, b, c) {}
threeArguments(); // И так можно
У объекта arguments
есть свойство length
, которое содержит реальное количество переданных функции аргументов. Также у него есть свойства для каждого аргумента под именами 0, 1, 2 и т. д.
Если вам кажется, что это очень похоже на массив – вы правы. Это очень похоже на массив. К сожалению, у этого объекта нет методов типа slice
или indexOf
, что делает доступ к нему труднее.
function argumentCounter() {
console.log("Ты дал мне", arguments.length, "аргумента.");
}
argumentCounter("Дядя", "Стёпа", "Милиционер");
// → Ты дал мне 3 аргумента.
Некоторые функции рассчитаны на любое количество аргументов, как console.log
. Они обычно проходят циклом по свойствам объекта arguments
. Это можно использовать для создания удобных интерфейсов. К примеру, вспомните, как мы создавали записи для журнала Жака:
addEntry(["работа", "тронул дерево", "пицца", "пробежка", "телевизор"], false);
Так как мы часто вызываем эту функцию, мы можем сделать альтернативу, которую проще вызывать:
function addEntry(squirrel) {
var entry = {events: [], squirreclass="underline" squirrel};
for (var i = 1; i < arguments.length; i++)
entry.events.push(arguments[i]);
journal.push(entry);
}
addEntry(true, "работа", "тронул дерево", "пицца", "пробежка", "телевизор");
Эта версия читает первый аргумент как обычно, а по остальным проходит в цикле (начиная с индекса 1, пропуская первый аргумент) и собирает их в массив.
Объект Math
Мы уже видели, что Math
– набор инструментов для работы с числами, такими, как Math.max
(максимум), Math.min
(минимум), и Math.sqrt
(квадратный корень).
Объект Math
используется просто как контейнер для группировки связанных функций. Есть только один объект Math
, и он почти не используется в виде значений. Он просто предоставляет пространство имён для всех этих функций и значений, чтоб не нужно было делать их глобальными.
Слишком большое число глобальных переменных «загрязняет» пространство имён. Чем больше имён занято, тем больше вероятность случайно использовать одно из них в качестве переменной. К примеру, весьма вероятно, что вы захотите использовать имя max
для чего-то в своей программе. Поскольку встроенная в JavaScript функция max
безопасно упакована в объект Math
, нам не нужно волноваться по поводу того, что мы её перезапишем.
Многие языки остановят вас, или хотя бы предупредят, когда вы будете определять переменную с именем, которое уже занято. JavaScript не будет этого делать, поэтому будьте осторожны.
Возвращаясь к объекту Math
, если вам нужна тригонометрия, он вам поможет. У него есть cos
(косинус), sin
(синус), и tan
(тангенс), их обратные функции — acos
, asin
, и atan
. Число π (pi) – или, по крайней мере, его близкая аппроксимация, помещающаяся в число JavaScript – также доступно как Math.PI
. (Есть такая старая традиция в программировании — записывать имена констант в верхнем регистре.)
function randomPointOnCircle(radius) {
var angle = Math.random() * 2 * Math.PI;
return {x: radius * Math.cos(angle),
y: radius * Math.sin(angle)};
}
console.log(randomPointOnCircle(2));
// → {x: 0.3667, y: 1.966}
Если вы незнакомы с синусами и косинусами – не отчаивайтесь. Мы их будем использовать в 13 главе, и тогда я их объясню.
В предыдущем примере используется Math.random
. Это функция, возвращающая при каждом вызове новое псевдослучайное число между нулём и единицей (включая ноль).
console.log(Math.random());
// → 0.36993729369714856
console.log(Math.random());
// → 0.727367032552138
console.log(Math.random());
// → 0.40180766698904335
Хотя компьютеры – машины детерминированные (они всегда реагируют одинаково на одни и те же входные данные), возможно заставить их выдавать кажущиеся случайными числа. Для этого машина хранит у себя во внутреннем состоянии несколько чисел. Каждый раз, когда идёт запрос на случайное число, она выполняет разные сложные детерминированные вычисления и возвращает часть результата вычислений. Этот результат она использует для того, чтобы изменить своё внутреннее состояние, поэтому следующее «случайное» число получается другим.