0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Данные, которыми мы оперируем в своих программах, могут обладать важными свойствами - например, у строк есть длина. Как вы увидите далее, это свойство очень важно для реализации алгоритмов, связанных с преобразованием строки (как пример - переворот строки). Как узнать длину строки? Во многих языках длина строки вычисляется с помощью специальной функции и выглядит это примерно так:</p>
1
<p>Данные, которыми мы оперируем в своих программах, могут обладать важными свойствами - например, у строк есть длина. Как вы увидите далее, это свойство очень важно для реализации алгоритмов, связанных с преобразованием строки (как пример - переворот строки). Как узнать длину строки? Во многих языках длина строки вычисляется с помощью специальной функции и выглядит это примерно так:</p>
2
<p>В JavaScript свойства встроены прямо в язык. Они указываются через точку сразу после переменной (или константы):</p>
2
<p>В JavaScript свойства встроены прямо в язык. Они указываются через точку сразу после переменной (или константы):</p>
3
<p>Свойства связаны с данными, у которых они берутся. Для стандартных типов все свойства описаны в документации, как например, у<a>строк</a>. При этом у чисел вообще нет свойств.</p>
3
<p>Свойства связаны с данными, у которых они берутся. Для стандартных типов все свойства описаны в документации, как например, у<a>строк</a>. При этом у чисел вообще нет свойств.</p>
4
<p>JavaScript позволяет обращаться к свойствам, которые не существуют (например, при опечатках). В таком случае их значением является undefined:</p>
4
<p>JavaScript позволяет обращаться к свойствам, которые не существуют (например, при опечатках). В таком случае их значением является undefined:</p>
5
<p><em>Вопрос для самопроверки. Что распечатает код console.log(name[name.length]) для name, определенного выше? Почему ответ такой?</em></p>
5
<p><em>Вопрос для самопроверки. Что распечатает код console.log(name[name.length]) для name, определенного выше? Почему ответ такой?</em></p>
6
<h2>Методы</h2>
6
<h2>Методы</h2>
7
<p>В JavaScript у данных есть не только свойства, но и методы. Методы - это функции, которые находятся внутри свойств. Это означает, что метод можно вызвать как функцию, но при этом он работает как свойство и вызывается через точку.</p>
7
<p>В JavaScript у данных есть не только свойства, но и методы. Методы - это функции, которые находятся внутри свойств. Это означает, что метод можно вызвать как функцию, но при этом он работает как свойство и вызывается через точку.</p>
8
<p>Встроенные методы всегда оперируют теми данными, с которыми они связаны. Метод .toUpperCase() возвращает такую же строку, но преобразуя все символы в верхний регистр. Методов у данных обычно значительно больше, чем свойств, например, для строк их<a>несколько десятков</a>. В документации, на первый взгляд, они описаны немного странно:<em>String.prototype.toLowerCase()</em>. Это описание раскрывает некоторые внутренние детали реализации, которые сейчас не важны, да и мы не изучили всей необходимой базы для разговора о прототипах.</p>
8
<p>Встроенные методы всегда оперируют теми данными, с которыми они связаны. Метод .toUpperCase() возвращает такую же строку, но преобразуя все символы в верхний регистр. Методов у данных обычно значительно больше, чем свойств, например, для строк их<a>несколько десятков</a>. В документации, на первый взгляд, они описаны немного странно:<em>String.prototype.toLowerCase()</em>. Это описание раскрывает некоторые внутренние детали реализации, которые сейчас не важны, да и мы не изучили всей необходимой базы для разговора о прототипах.</p>
9
<p>Методы есть и у<a>чисел</a>:</p>
9
<p>Методы есть и у<a>чисел</a>:</p>
10
<p><em>Технически всё несколько сложнее. Методы есть не у самих чисел, а у данных (объектов) типа Number. Числа, записанные в переменные или константы, автоматически преобразуются к данному типу во время обращения к ним, в это время происходит так называемый boxing.</em></p>
10
<p><em>Технически всё несколько сложнее. Методы есть не у самих чисел, а у данных (объектов) типа Number. Числа, записанные в переменные или константы, автоматически преобразуются к данному типу во время обращения к ним, в это время происходит так называемый boxing.</em></p>
11
<p>Возникает закономерный вопрос: зачем нужны методы, почему не просто функции? С числами ситуация еще сложнее. Часть операций реализована в виде методов самих чисел, например, .toFixed(), а еще большая часть - в виде методов, доступных через Math.</p>
11
<p>Возникает закономерный вопрос: зачем нужны методы, почему не просто функции? С числами ситуация еще сложнее. Часть операций реализована в виде методов самих чисел, например, .toFixed(), а еще большая часть - в виде методов, доступных через Math.</p>
12
<p>Есть две причины, почему так сделано:</p>
12
<p>Есть две причины, почему так сделано:</p>
13
<ol><li>Исторически так сложилось. JavaScript разрабатывался слишком быстро и поэтому не все было продумано хорошо.</li>
13
<ol><li>Исторически так сложилось. JavaScript разрабатывался слишком быстро и поэтому не все было продумано хорошо.</li>
14
<li>Далеко не все функции имеют отношение к конкретному значению. Возьмем для примера Math.min(). Эта функция находит минимальное число среди всех, которые ему были переданы. Эту функцию нелогично делать методом конкретного числа, например, так - (1).min(). Она не имеет никакой связи с конкретным числом</li>
14
<li>Далеко не все функции имеют отношение к конкретному значению. Возьмем для примера Math.min(). Эта функция находит минимальное число среди всех, которые ему были переданы. Эту функцию нелогично делать методом конкретного числа, например, так - (1).min(). Она не имеет никакой связи с конкретным числом</li>
15
</ol><p>С другой стороны, функции, работающие с конкретным числом, для единообразия должны быть реализованы как методы. К таким функциям относится получение модуля числа. То есть вместо такого вызова Math.abs(-10), логично иметь такой: (-10).abs().</p>
15
</ol><p>С другой стороны, функции, работающие с конкретным числом, для единообразия должны быть реализованы как методы. К таким функциям относится получение модуля числа. То есть вместо такого вызова Math.abs(-10), логично иметь такой: (-10).abs().</p>
16
<p>Что касается методов в целом, то не все так однозначно. Есть языки, в которых методов нет и там все прекрасно, есть языки, где методы - это основной способ работы с функциями. JavaScript - язык, в котором прижились оба подхода, в нем активно используются как обычные функции, так и методы. О плюсах и минусах подобных подходов подробно рассказывается в курсах,<a>посвященных ООП</a>.</p>
16
<p>Что касается методов в целом, то не все так однозначно. Есть языки, в которых методов нет и там все прекрасно, есть языки, где методы - это основной способ работы с функциями. JavaScript - язык, в котором прижились оба подхода, в нем активно используются как обычные функции, так и методы. О плюсах и минусах подобных подходов подробно рассказывается в курсах,<a>посвященных ООП</a>.</p>
17
<h2>Неизменяемость</h2>
17
<h2>Неизменяемость</h2>
18
<p>Что напечатает на экран последний вызов?</p>
18
<p>Что напечатает на экран последний вызов?</p>
19
<p>Ответ на этот вопрос зависит от того, как вы поняли урок про неизменяемость примитивных типов данных. Вызов метода .toUpperCase() возвращает новое значение, в котором все буквы преобразованы в верхний регистр, но он не меняет (и не может этого сделать) исходную строку. Поэтому внутри константы (или переменной - это не важно) окажется старое значение: 'Tirion'. Эта логика справедлива для методов всех примитивных типов. Более того, попытка изменить значение свойства этих данных ни к чему не приведет:</p>
19
<p>Ответ на этот вопрос зависит от того, как вы поняли урок про неизменяемость примитивных типов данных. Вызов метода .toUpperCase() возвращает новое значение, в котором все буквы преобразованы в верхний регистр, но он не меняет (и не может этого сделать) исходную строку. Поэтому внутри константы (или переменной - это не важно) окажется старое значение: 'Tirion'. Эта логика справедлива для методов всех примитивных типов. Более того, попытка изменить значение свойства этих данных ни к чему не приведет:</p>
20
<p>Вместо изменения значения можно<em>заменить</em>значение. Для этого понадобятся переменные:</p>
20
<p>Вместо изменения значения можно<em>заменить</em>значение. Для этого понадобятся переменные:</p>
21
<h2>Свойства и методы как выражения</h2>
21
<h2>Свойства и методы как выражения</h2>
22
<p>Свойства и методы - такие же выражения, как переменные, константы или вызовы функции, а значит, их можно всячески комбинировать.</p>
22
<p>Свойства и методы - такие же выражения, как переменные, константы или вызовы функции, а значит, их можно всячески комбинировать.</p>
23
<p>Использование в операциях:</p>
23
<p>Использование в операциях:</p>
24
<p>Использование в параметрах функций:</p>
24
<p>Использование в параметрах функций:</p>
25
25