Классы и методы

4.3. Класс Number
Класс Number представляет числа (значения числового типа).
Он поддерживает следующие полезные нам методы:

♦ isInteger(<число>) — статический, возвращает true, если заданное число целое, и false в противном случае.

Статический метод — вызывается не у объекта какого-либо класса, а у самого класса. Выполняет манипуляции лишь над переданными ему параметрами.

Примеры:




Number.isInteger(123)
// true

Number.isInteger(1.23)
// false
♦ toString([<основание>]) — преобразует текущее число в строку, которую и возвращает в качестве результата.
Если задано основание, результат возвращается в системе счисления, соответствующей этому основанию.
Если основание не задано, число возвращается в десятичной системе:




let a = 123
a.toString()
// "123"

a.toString(8)
// "173"

a.toString(16)
// "7b"


♦ toExponential([<количество цифр после точки>]) — преобразует текущее число в экспоненциальный вид и возвращает в виде строки.
Если количество цифр после десятичной точки не указано, веб-обозреватель выведет столько цифр, сколько нужно для представления этого числа:




a = 123456.789123
a.toExponential()
// "1.23456789123e+5"

a.toExponential(3)
// "1.235e+5"
♦ toFixed(<количество цифр после десятичной точки>) — округляет текущее число до заданного количества цифр после десятичной точки (если не указано, округляет на целое) и возвращает в виде строки:




a.toFixed()
// "123457"

a.toFixed(2)
// "123456.79"
♦ toPrecision(<длина числа в цифрах>) — усекает текущее число до заданной длины и возвращает в виде строки.
Если длина не указана, возвращает строку с неурезанным числом:




a.toPrecision(7)
// "123456.8"

a.toPrecision()
// "123456.789123"
Также могут оказаться полезными два статических свойства, поддерживаемые этим классом:

MIN_VALUE — возвращает наименьшее число, которое способен обработать JavaScript;

MAX_VALUE — возвращает наибольшее число, которое способен обработать JavaScript.

Статическое свойство — принадлежит не объекту, а классу.
Хранит значение, которое характеризует сам класс.

Примеры:




Number.MIN_VALUE
// 5e-324

Number.MAX_VALUE
// 1.7976931348623157e+308


4.4. Класс String
Класс String представляет значения строкового типа, относящегося к значениям типов.

Свойство length этого класса возвращает длину строки в символах:




'JavaScript'.length
// 10
Класс String поддерживает весьма много методов:

♦ toLocaleLowerCase() — возвращает копию текущей строки, в которой все символы приведены к нижнему регистру с учётом языковых настроек системы:




'JavaScript'.toLocaleLowerCase()
// "javascript"
♦ toLowerCase() — то же самое, что и toLocaleLowerCase, но не учитывает языковые настройки.
Пригоден только для преобразования строк, набранных латиницей;

♦ toLocaleUpperCase() — возвращает копию текущей строки, в которой все символы приведены к верхнему регистру с учётом языковых настроек системы:




'JavaScript'.toLocaleUpperCase()
// "JAVASCRIPT"
♦ toUpperCase() — то же самое, что и toLocaleUpperCase, но не учитывает языковые настройки.
Пригоден только для преобразования строк, набранных латиницей;

♦ trim() — возвращает копию текущей строки, у которой пробелы в начале и конце удалены:




'   HTML и CSS   '.trim()
// "HTML и CSS"
♦ includes(<подстрока>) — возвращает true, если текущая строка содержит указанную подстроку, и false в противном случае:




'HTML и CSS'.includes('CSS')
// true

'HTML и CSS'.includes('Python')
// false
♦ startsWith(<подстрока>) — возвращает true, если текущая строка начинается с указанной подстроки, и false в противном случае:




'HTML и CSS'.startsWith('PHP')
// false
♦ endsWith(<подстрока>) — возвращает true, если текущая строка оканчивается указанной подстрокой, и false в противном случае:




'HTML и CSS'.endsWith('CSS')
// true

♦ indexOf(<подстрока>[, <начальная позиция для поиска>]) — возвращает номер позиции, на которой в текущей строке находится заданная подстрока.
Поиск начинается с указанной начальной позиции, а если она не задана — с начала строки (с символа с номером 0).
Если подстрока не найдена, возвращается -1:




'JavaScript'.indexOf('a')
// 1

'JavaScript'.indexOf('a', 2)
// 3

'JavaScript'.indexOf('z')
// -1
♦ lastIndexOf(<подстрока>[, <начальная позиция для поиска>]) — то же самое, что indexOf, но поиск начинается с конца строки:




'JavaScript'.lastIndexOf('a')
// 3
♦ charAt(<номер символа>) — возвращает символ текущей строки, имеющий указанный номер.
Нумерация символов начинается с 0:




'HTML и CSS'.charAt(2)
// "M"
Вместо этого метода можно использовать оператор доступа к элементу массива [], описанный в разд. 3.10:




'HTML и CSS'[2]
// "M"
♦ substr(<номер первого символа фрагмента>[, <количество символов во фрагменте>]) — возвращает фрагмент текущей строки.
Если количество символов не указано, возвращаемый фрагмент будет содержать остаток строки.
Если номер первого символа отрицательный — он будет отсчитываться от конца строки.
Нумерация символов начинается с 0:




'JavaScript'.substr(4)
// "Script"

'JavaScript'.substr(4, 3)
// "Scr"

'JavaScript'.substr(-4)
// "ript"

'JavaScript'.substr(-4, 3)
// "rip"
♦ substring(<номер первого символа фрагмента>, <номер последнего символа фрагмента>) — возвращает фрагмент текущей строки.
Если номер последнего символа не указан, возвращаемый фрагмент будет содержать остаток строки.
Нумерация символов начинается с 0.

♦ substring(<номер первого символа фрагмента>, <номер последнего символа фрагмента>) — возвращает фрагмент текущей строки.
Если номер последнего символа не указан, возвращаемый фрагмент будет содержать остаток строки.
Нумерация символов начинается с 0:




'JavaScript'.substring(4)
// "Script"

'JavaScript'.substring(4, 7)
// "Scr"
♦ replace(<заменяемая подстрока>, <заменяющая подстрока>) — заменяет в текущей строке первое вхождение заменяемой подстроки на заменяющую и возвращает результат:




'HTML и Python'.replace('Python', 'CSS')
// "HTML и CSS"
Чтобы заменить все вхождения заменяемой подстроки, следует использовать регулярное выражение (их применение будет описано в уроке 10);

♦ split(<разделитель>[, <предельный размер массива>]) — разбивает текущую строку на подстроки по заданному символу-разделителю, формирует из подстрок массив и возвращает его в качестве результата.
Можно указать предельный размер массива — тогда избыточные подстроки в него не попадут:




'HTML,CSS,JavaScript'.split(',')
// ["HTML", "CSS", "JavaScript"]

'HTML,CSS,JavaScript'.split(',', 2)
// ["HTML", "CSS"]
♦ charCodeAt(<номер символа>) — возвращает числовой Unicode-код символа с указанным номером.
Нумерация символов начинается с 0:




'HTML и CSS'.charCodeAt(5)
// 1080  // Код буквы "и"
♦ fromCharCode(<код 1>, <код 2>, ... <код n>) — статический метод, возвращает строку, составленную из символов с заданными Unicode-кодами:




String.fromCharCode(0x42f, 0x437, 0x44b, 0x20, 0x43a, 0x53, 0x53)
// "Язык CSS"
4.5. Класс Array
Класс Array служит для представления массивов.

Свойство length этого класса возвращает размер массива, т. е. количество элементов в нём:




let arr1 = [1, 2, 3, 4]
arr1.length
// 4

Методов класс Array поддерживает много:

♦ isArray(<объект>) — статический, возвращает true, если объект является массивом, и false в противном случае:




Array.isArray(arr1)
// true

Array.isArray(1234)
// false
♦ push(<значение 1>, <значение 2>, ... <значение n>) — добавляет в конец массива указанные значения и возвращает новый размер массива:




let arr2 = [10, 11]
arr2.push(12, 13)
// 4

arr2
// [10, 11, 12, 13]
♦ unshift(<значение 1>, <значение 2>, ... <значение n>) — добавляет в начало массива указанные значения и возвращает новый размер массива:




arr2.unshift(8, 9)
// 6

arr2
// [8, 9, 10, 11, 12, 13]
♦ pop() — удаляет последний элемент массива и возвращает его в качестве результата:




arr2.pop()
// 13

arr2
// [8, 9, 10, 11, 12]
♦ shift() — удаляет первый элемент массива и возвращает его в качестве результата:




arr2.shift()
// 8

arr2
// [9, 10, 11, 12]
♦ splice(<индекс первого удаляемого элемента>[, <количество удаляемых элементов>[, <элемент 1>, <элемент 2>, ... <элемент n>]])
— удаляет из текущего массива заданное количество элементов и вставляет на их место заданные элементы.
Если индекс первого удаляемого элемента отрицательный, он отсчитывается с конца массива.
Если количество удаляемых элементов не указано, будет удален только элемент с заданным индексом,
если оно равно 0 — никакие элементы удалены не будут. В качестве результата возвращается массив с удалёнными элементами.



let arr3 = ['HTML', 'C++', 'Python']
arr3.splice(1, 1, 'CSS')
// ["C++"]

arr3
// ["HTML", "CSS", "Python"]

arr3.splice(2, 0, 'JavaScript', 'PHP')

arr3
// ["HTML", "CSS", "JavaScript", "PHP", "Python"]
♦ includes(<значение>[, <начальный индекс>]) — возвращает true, если массив содержит элемент с заданным значением, и false в противном случае.
Поиск ведётся, начиная с элемента с указанным начальным индексом, если же таковой не указан — с самого первого элемента массива:




let arr4 = [1, 1, 2, 3, 3, 4]
arr4.includes(1)
// true

arr4.includes(1, 3)
// false
Метод includes для сравнения указанного значения с элементами текущего массива использует оператор === (строго равно).
Следовательно, типы значения и элементов массива должны совпадать,
в противном случае поиск не увенчается успехом:




arr4.includes('3')
// false
♦ indexOf(<значение>[, <начальный индекс>]) — возвращает индекс элемента текущего массива, хранящего заданное значение.
Поиск начинается с элемента с указанным начальным индексом.
Если начальный индекс отрицательный — он отсчитывается от конца массива.
Если он не указан, поиск начинается с первого элемента.
Если подходящий элемент не найден, возвращается -1:




arr4.indexOf(3)
// 2

arr4.indexOf(3, 4)
// 4

arr4.indexOf(3, -2)
// 5
Этот метод для сравнения указанного значения с элементами текущего массива также использует оператор === (строго равно);

♦ lastIndexOf(<значение>[, <начальный индекс>]) — то же самое, что и indexOf, только поиск начинается с конца массива:




arr4.lastIndexOf(3)
// 4

every(<функция проверки>[, <значение this>]) — возвращает true, если все элементы текущего массива проходят проверку.
Если хоть один элемент массива не проходит проверку, возвращается false.

Проверку осуществляет указанная функция, принимающая три параметра:
очередной элемент массива, индекс этого элемента и сам массив (два последних параметра необязательны).
Функция должна возвращать логическое значение: true (если элемент прошел проверку) или false (в противном случае):




// Проверяем, все ли элементы массива arr1 больше 0
arr1.every((el, ind, ar) => el > 0)
// true

// Проверяем, все ли элементы массива arr1 больше 2
arr1.every((el) => el > 2)
// false
Вторым параметром можно передать значение, которое будет доступно в теле функции проверки через локальную переменную this;

♦ some(<функция проверки>[, <значение this>]) — то же самое, что и every, только возвращает true, если проверку проходит хоть бы один элемент текущего массива:




arr1.some((el, ind, ar) => el > 2)
// true
♦ find(<функция проверки>[, <значение this>]) — возвращает первый элемент текущего массива, который прошел проверку.
Если ни один элемент не прошел проверку, возвращается undefined.
Параметры этого метода те же, что и у метода every:




arr1.find((el) => el > 3)
// undefined

arr1.find((el) => el > 2)
// 3
♦ findIndex(<функция проверки>[, <значение this>]) — то же самое, что и find, но возвращает индекс первого прошедшего проверку элемента;

♦ filter(<функция проверки>[, <значение this>]) — возвращает массив, составленный из элементов текущего массива, которые прошли проверку.
Параметры этого метода те же, что и у метода every:




arr1.filter((el) => el > 2)
// [3, 4]
♦ forEach(<функция>[, <значение this>]) — просто вызывает указанную функцию для каждого элемента текущего массива.
Результата не возвращает.
Функция должна принимать те же параметры, что и аналогичная функция у метода every,
но не должна возвращать результат.

// Выводим на экран все элементы массива arr1
arr1.forEach((el) => {
  window.document.write('<p>', el, '</p>');
});
♦ map(<функция>[, <значение this>]) — вызывает указанную функцию для каждого элемента текущего массива,
помещает возвращённые ею результаты в новый массив и возвращает его.
Функция должна принимать те же параметры, что и аналогичная функция у метода every,
и возвращать результат действий с очередным элементом массива:




// Создаем массив квадратов чисел из массива arr1
arr1.map((el) => el ** 2)
// [4, 1, 4, 9, 16]
♦ reduce(<функция>[, <начальное значение>]) — вызывает указанную функцию для каждого элемента текущего массива.
Функция должна принимать следующие параметры:

результат, возвращённый предыдущим вызовом этой функции.
Если это первый вызов (обрабатывается первый элемент массива),
хранит заданное начальное значение, если оно не указано — значение первого элемента массива;

значение очередного элемента текущего массива;

индекс очередного элемента текущего массива (необязательный);

ссылка на текущий массив (необязательный).

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

В качестве результата метод reduce возвращает значение, возвращённое последним вызовом функции.

Элементы текущего массива перебираются в направлении от начала к концу.

Примеры:




// Подсчитываем сумму элементов массива
arr1.reduce((sum, el) => sum + el)
// 10

// Создаем строку из пронумерованных элементов массива через запятую
arr3.reduce((str, el, i) => str + ++i + ': ' + el + ', ', '')
// "1: HTML, 2: CSS, 3: JavaScript, 4: PHP, 5: Python, "
♦ reduceRight(<функция>[, <начальное значение>]) — то же самое, что и reduce,
но элементы текущего массива перебираются от конца к началу:




arr3.reduceRight((str, el, i) => str + ++i + ': ' + el + ', ', '')
// "5: Python, 4: PHP, 3: JavaScript, 2: CSS, 1: HTML, "

fill(<значение>[, <начальный индекс>[, <конечный индекс>]]) — заполняет элементы текущего массива между начальным и конечным индексом заданным значением,
при этом элемент с конечным индексом не заполняется.
Если конечный индекс не указан, заполнение ведётся до конца массива.
Если начальный индекс не указан, заполнение ведётся начиная с первого элемента массива.
Результата метод не возвращает:




[10, 11, 12, 13, 14].fill(0)
// [0, 0, 0, 0, 0]

[10, 11, 12, 13, 14].fill(0, 2)
// [10, 11, 0, 0, 0]

[10, 11, 12, 13, 14].fill(0, 2, 4)
// [10, 11, 0, 0, 14]
♦ join([<разделитель>]) — объединяет все элементы текущего массива в строку,
разделяя их заданным символом-разделителем, и возвращает эту строку в качестве результата.
Если разделитель не задан, используется запятая:




arr2.join()
// "HTML,CSS,JavaScript"

arr2.join(', ')
// "HTML, CSS, JavaScript"
♦ concat(<массив 1>, <массив 2>, ..., <массив n>) — создаёт новый массив, содержащий все элементы из текущего и всех переданных ему массивов,
и возвращает его в качестве результата:




arr1.concat([5, 6], [10, 11, 12])
// [1, 2, 3, 4, 5, 6, 10, 11, 12]
♦ slice([<начальный индекс>[, <конечный индекс>]]) — формирует из элементов текущего массива, расположенных между начальным и конечным индексом,
новый массив и возвращает его.
Если конечный индекс не указан — в новый массив помещаются все оставшиеся элементы.
Если и начальный индекс не указан — создаётся копия текущего массива:




arr1.slice(1, 3)
// [2, 3]

arr1.slice(1)
// [2, 3, 4]

arr1.slice()
// [1, 2, 3, 4]
4.5.1. Сортировка массивов
Для сортировки массива применяется метод sort класса Array:




sort([<функция сравнения>])
В качестве результата метод возвращает текущий массив, уже отсортированный.

Если функция сравнения не указана, метод sort сортирует числа по возрастанию:




let arr1 = [32, 7, 90, -4, 15, 900, 64]
arr1.sort()
// [-4, 15, 32, 64, 7, 90, 900]
Строки сортируются по возрастанию сумм кодов содержащихся в них символов —
в результате выполняется сортировка в алфавитном порядке:




let arr2 = ['HTML', 'Ruby', 'CSS', 'PHP', 'Python', 'C++']
arr2.sort()
// ["C++", "CSS", "HTML", "PHP", "Python", "Ruby"]
Если нужно отсортировать массив в другом порядке, в вызове метода sort следует задать функцию сравнения.
Она должна принимать два параметра — два сравниваемых элемента массива — и возвращать:

любое отрицательное число, если первый элемент меньше второго;

0, если элементы равны;

любое положительное число, если первый элемент больше второго.

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




arr1.sort((el1, el2) => el2 - el1)
// [900, 90, 64, 32, 15, 7, -4]
Теперь разберемся со строками.
Выяснить, какая из них "меньше", а какая "больше", можно посредством обычных операторов сравнения < и >:




'CSS' < 'PHP'
// true

'Python' > 'Ruby'
// false
Но в функции сравнения для этой цели удобнее применять метод localeCompare класса String.
Вот формат его вызова:




строка.localeCompare(сравниваемая строка)
Метод возвращает:

-1 — если текущая строка меньше сравниваемой;

0 — если обе строки равны;

1 — если текущая строка больше сравниваемой.

Пример сортировки массива со строками в порядке, обратном алфавитному:




arr2.sort((el1, el2) => el2.localeCompare(el1))
// ["Ruby", "Python", "PHP", "HTML", "CSS", "C++"]
Метод reverse класса Array меняет порядок следования элементов массива на противоположный.
Метод не принимает параметров и возвращает ссылку на текущий массив.

4.6. Класс Date
Класс Date служит для представления временных отметок (даты и времени наступления каких-либо событий).

Создать объект этого класса можно только с помощью оператора new.

Оператор создания объекта new создаёт объект класса с указанным именем
и возвращает его в качестве результата. Он записывается в формате:
new <имя класса>([<параметры объекта через запятую>])

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

Выражение, создающее объект временной отметки, можно записать в трёх форматах:

♦ new Date() — создаёт временную отметку, которая будет хранить текущие дату и время:




let date1 = new Date();
♦ new Date(<год>, <номер месяца, начиная с 0>, <число>[, <часы>, <минуты>, <секунды>[, <миллисекунды>]]) —
временная отметка будет хранить указанные дату и время:




// 1 января 2019 года, 11:45:09.400
let date2 = new Date(2019, 0, 1, 11, 45, 9, 400);
Если не указать миллисекунды, количество миллисекунд во временной отметке будет установлено равным 0:




// 1 января 2019 года, 11:45
let date3 = new Date(2019, 0, 1, 11, 45, 0);
Если также не указать часы, минуты и секунды, временная отметка будет хранить полночь указанной даты:




// 28 января 2019 года, полночь
let date4 = new Date(2019, 1, 28);
♦ new Date(<строка с датой и временем>) — строка с датой и временем указывается в формате:

php-template


<ГГГГ>-<ММ>-<ДД> <часы>:<минуты>:<секунды>
⚠️ Месяцы в этом случае нумеруются с 1:




// 12 марта 2019 года, 12:05:40
let date5 = new Date('2019-03-12 12:05:40');

// 12 марта 2019 года, полночь
let date6 = new Date('2019-03-12');

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

Таблица 4.2. Методы класса Date
Составляющая	Получение	Изменение
Год	getFullYear()	setFullYear(<год>)
№ месяца	getMonth()	setMonth(<# месяца>)
Число	getDate()	setDate(<число>)
Часы	getHours()	setHours(<часы>)
Минуты	getMinutes()	setMinutes(<минуты>)
Секунды	getSeconds()	setSeconds(<секунды>)
Миллисекунды	getMilliseconds()	setMilliseconds(<мс>)

Нумерация месяцев начинается с нуля: 0 — январь, 1 — февраль и т. д.

Примеры:



// Какой сейчас год?
date1.getFullYear()
// 2019

// А месяц?
date1.getMonth()
// 2  // Третий по счёту месяц — март

// Меняем месяц на июль, а число — на 24-е
date2.setMonth(6)
date2.setDate(24)
Ещё несколько полезных методов:
getDay() — возвращает порядковый номер дня недели от 0 до 6:
0 — воскресенье, 1 — понедельник и т. д.;

toLocaleString() — преобразует текущую временную отметку в строку согласно языковым параметрам системы:




date1.toLocaleString()
// "19.03.2019, 11:14:45"
toLocaleDateString() — преобразует дату из текущей временной отметки в строку:




date1.toLocaleDateString()
// "19.03.2019"
toLocaleTimeString() — преобразует время из текущей временной отметки в строку:
(всё согласно языковым параметрам системы).

4.7. Класс Math
Класс Math содержит только статические свойства, хранящие математические константы,
и статические методы, реализующие действия математики и тригонометрии.

Статические свойства класса Math:
PI — число π:




Math.PI
// 3.141592653589793
E — число e (основание натурального логарифма);

SQRT2 — квадратный корень из 2;

SQRT1_2 — квадратный корень из 0.5;

LN2 — ln 2 (натуральный логарифм от 2);

LN10 — ln 10 (натуральный логарифм от 10);

LOG2E — lb e (двоичный логарифм от числа e);

LOG10E — lg e (десятичный логарифм от числа e).

Методы класса Math и возвращаемые ими результаты:
sqrt(<число>) — квадратный корень от числа:




Math.sqrt(20)
// 4.47213595499958
cbrt(<число>) — кубический корень от числа;

min(<перечисленное множество чисел>) — наименьшее число из указанных:




Math.min(2, 56, 900, 425, -87)
// -87
max(<перечисленное множество чисел>) — наибольшее число из указанных;

abs(<число>) — модуль (абсолютная величина) числа;

round(<число>) — число, округлённое до ближайшего целого;

floor(<число>) — число, округлённое до ближайшего меньшего целого;

ceil(<число>) — число, округлённое до ближайшего большего целого;

trunc(<число>) — целая часть числа;

sin(<угол>) — синус угла, заданного в радианах.

Пояснение:
Пересчитать угол из градусов в радианы можно по формуле:
αₚ = α₍₉ᵣₐ𝒹₎ × π / 180

Пример вычисления синуса угла 45°:




let angle = 45 * Math.PI / 180
angle
// 0.7853981633974483

Math.sin(angle)
// 0.7071067811865475
Тригонометрические методы:
cos(<угол>) — косинус угла (в радианах);

tan(<угол>) — тангенс угла (в радианах);

asin(<число>) — арксинус в радианах от числа;

acos(<число>) — арккосинус в радианах от числа;

atan(<число>) — арктангенс в радианах от числа;

Пояснение:
Пересчитать угол из радианов в градусы можно по формуле:
α₍₉ᵣₐ𝒹₎ = αₚ × 180 / π

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




let at = Math.atan(1)
at * 180 / Math.PI
// 45
Гиперболические методы:
sinh(<число>) — гиперболический синус;

cosh(<число>) — гиперболический косинус;

tanh(<число>) — гиперболический тангенс;

asinh(<число>) — гиперболический арксинус;

acosh(<число>) — гиперболический арккосинус;

atanh(<число>) — гиперболический арктангенс;

Прочее:
atan2(<y>, <x>) — угол в радианах между осью X и точкой с координатами [x, y], отсчитанный против часовой стрелки;

random() — возвращает псевдослучайное дробное число от 0 до 1:




Math.random()
// 0.222... (пример)
log(<число>) — натуральный логарифм;

exp(<число>) — значение e^x;

pow(<a>, <b>) — значение a^b:

Метод pow остался от старых версий JavaScript и может встретиться в старом коде.

4.8. Класс Arguments. Коллекции
Класс Arguments представляет список значений параметров, полученных функцией при вызове.

Объект этого класса создаётся самим веб-обозревателем при исполнении тела функции
и присваивается локальной переменной arguments (из разд. 3.2 мы знаем, что локальные переменные существуют только внутри тела функции).

Класс Arguments поддерживает свойство length, возвращающее количество параметров, полученных функцией.

Для получения значений параметров применяется оператор доступа к элементу [ ], как у массива.

Пример функции, использующей объект класса Arguments:




function manyParameters() {
  let l = arguments.length, i, el;
  for (i = 0; i < l; i++) {
    el = arguments[i];
    ...
  }
}
Как видим, объект этого класса похож на массив, но им не является.

Коллекция — объект, имеющий функциональность массива.
Все классы коллекций поддерживают оператор [ ] и свойство length.

4.9. Класс Object. Служебные объекты. Объектная нотация
Класс Object — самый простой из всех поддерживаемых JavaScript классов
и одновременно самый фундаментальный.
Все остальные классы (String, Date, Array, ...) — его наследники.

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

Создать служебный объект проще всего, применив объектную нотацию, которая записывается в формате:




{
  имя_свойства_1: <значение свойства 1>,
  имя_свойства_2: <значение свойства 2>,
  ...
  имя_свойства_n: <значение свойства n>
}

Пары <имя свойства>: <значение свойства> отделяются друг от друга запятыми,
а не точками с запятой. После последней пары запятая не ставится.

Пример:
♦ создаем служебный объект, хранящий сведения о каком-либо человеке:




let person = {
  name1: 'Иван',
  name2: 'Иванов',
  age: 48
};
♦ обращаемся к свойству name2 этого объекта:




let n = person.name2;
♦ передаем объект функции в качестве параметра:




let result = computePerson(person);
Служебные объекты применяются в веб-разработке весьма активно,
т. к. могут хранить любой набор значений, а создать их очень просто.

Object — наиболее фундаментальный из всех классов JavaScript.
Все остальные классы являются его наследниками.

Наследование — создание одного класса на основе другого.
Унаследованный класс (производный, или подкласс),
помимо свойств и методов, определенных в нём самом,
получает все свойства и методы класса, от которого он унаследован
(базового, или суперкласса).

4.10. Объектный тип. Значение null
Все объекты, не являющиеся строкой, числом, логическим значением или функцией,
относятся к объектному типу.

Оператор typeof возвращает для таких типов строку "object".

Пример:



date1 = new Date()
typeof date1
// "object"

typeof [1, 2, 3]
// "object"
Значение null, также принадлежащее к объектному типу,
обозначает нулевую ссылку, не указывающую ни на один объект.

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

Любой объект преобразуется в логическое значение true
и числовое значение NaN,
в зависимости от типа выражения, в котором он поставлен.

Нулевая ссылка null преобразуется в false и 0.

Примеры:



(date1) ? 'Объект существует' : 'Объект не существует'
// "Объект существует"

(null) ? 'Объект существует' : 'Объект не существует'
// "Объект не существует"

12 + null
// 12

12 < null
// false
4.11. Хранение объектов в переменных.
Значащие и ссылочные типы
Объект может храниться в переменной по-разному,
в зависимости от того, к какой разновидности принадлежит его тип:
значащий или ссылочный.

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

Пример:



let a = 1, b;
b = a;
// Значение из переменной a копируется в переменную b

a = 2;
// Значение в переменной a изменилось...
a < b
// true — …при этом в переменной b осталось старое значение
📌 Объекты ссылочных типов хранятся в отдельной области памяти,
а в переменные записываются ссылки на них.
При присваивании такого объекта — копируется не сам объект, а ссылка.
Обе переменные будут указывать на один и тот же объект.

К ссылочным типам относятся: функции и объектный тип.

Пример:



date1 = new Date()
date2 = date1

Продолжение раздела о ссылочных типах (объекты Date, Object и др.)
Пример:




// Переменные date1 и date2 должны хранить ссылку на один и тот же объект временной отметки.
// Проверим это:
date1.getMonth()  // < 2  // Март
date2.getMonth()  // < 2

// Теперь изменим месяц на 1 (февраль), обратившись к переменной date1:
date1.setMonth(1)

// И снова проверим через переменную date2:
date2.getMonth()  // < 1  // Февраль
Вывод: переменные date1 и date2 действительно ссылаются на один и тот же объект.

4.12. Добавленные свойства
Кроме стандартных свойств и методов объектов, можно создавать свои собственные свойства.

📌 Добавленное свойство — это новое свойство, не определённое в классе,
которое присваивается вручную через оператор =.
Добавленные свойства работают только с объектами ссылочных типов.

Пример:



date1.description = "Текущая дата"
Теперь к этому свойству можно обратиться:




date1.description
// "Текущая дата"
Это свойство не появляется у других объектов:




date2 = new Date(2019, 1, 27, 12, 0, 0)
date2.description
// undefined
Удаление свойств
📌 Оператор delete удаляет добавленное свойство у объекта:




delete <переменная с объектом>.<удаляемое_свойство>

Удаление свойств
Удаление добавленного свойства description из объекта date1:




delete date1.description
Добавление новых свойств в любые объекты (в том числе обычные Object):
Пример:




// Добавим объекту person свойство workplaces
person.workplaces = [
  "Шары-Монтаж",
  "Монтаж-Шары",
  "Министерство свободного времени"
];
4.13. Дополнительные средства для работы с объектами
✔️ Оператор in
Проверяет, существует ли свойство в объекте.

📌 Синтаксис:




"<имя свойства>" in <переменная с объектом>
Примеры:




'name1' in person   // true — есть такое свойство
'address' in person // false — нет такого свойства
✔️ Оператор instanceof
Проверяет, принадлежит ли объект определённому классу.

📌 Синтаксис:




<объект> instanceof <класс>
Примеры:




person instanceof Object // true — объект person принадлежит классу Object
person instanceof Window // false — не принадлежит классу Window
Эти средства особенно полезны при отладке, валидации данных, наследовании и при работе с внешними API.\\



🔄 Цикл по свойствам объекта
Цикл for...in позволяет перебрать все свойства объекта:

📌 Формат:




for (переменная in объект) {
    // действия с объектом[переменная]
}
🔹 Пример для объекта person:




for (pr in person)
    window.document.write('<p>' + pr + ': ' + person[pr], '</p>');
На каждой итерации переменная pr получает имя одного из свойств объекта person, а person[pr] — значение этого свойства.

Спросить ChatGPT