0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Что произойдет, если мы попробуем умножить число на строку? JavaScript вернет NaN (не число) - то самое значение. Оно возникает там, где вместе используются несовместимые значения. В данном случае число и строка:</p>
1
<p>Что произойдет, если мы попробуем умножить число на строку? JavaScript вернет NaN (не число) - то самое значение. Оно возникает там, где вместе используются несовместимые значения. В данном случае число и строка:</p>
2
<p>Внутри высокоуровневых языков программирования данные разделяются по типам. Любая строка относится к типу String, а числа - к типу Number и BigInt (очень большие числа). Зачем нужны типы? Для защиты программы от трудноуловимых ошибок. Типы определяют две вещи:</p>
2
<p>Внутри высокоуровневых языков программирования данные разделяются по типам. Любая строка относится к типу String, а числа - к типу Number и BigInt (очень большие числа). Зачем нужны типы? Для защиты программы от трудноуловимых ошибок. Типы определяют две вещи:</p>
3
<ul><li>Возможные (допустимые) значения. Например, числа в JavaScript делятся на два типа: Number и BigInt. Первые - это все числа ниже определенного порога (его можно посмотреть), вторые - выше. Такое разделение связано с техническими особенностями работы аппаратуры.</li>
3
<ul><li>Возможные (допустимые) значения. Например, числа в JavaScript делятся на два типа: Number и BigInt. Первые - это все числа ниже определенного порога (его можно посмотреть), вторые - выше. Такое разделение связано с техническими особенностями работы аппаратуры.</li>
4
<li>Набор операций, которые можно выполнять над этим типом. Например, операция умножения имеет смысл для типа "целые числа". Но не имеет смысла для типа "строки": умножать слово "мама" на слово "блокнот" - бессмыслица.</li>
4
<li>Набор операций, которые можно выполнять над этим типом. Например, операция умножения имеет смысл для типа "целые числа". Но не имеет смысла для типа "строки": умножать слово "мама" на слово "блокнот" - бессмыслица.</li>
5
</ul><p>JavaScript ведет себя двояко, когда встречается с нарушениями. В некоторых ситуациях он ругается на недопустимость операции и завершается с ошибкой. В других - программа продолжает работать. В этом случае недопустимая операция возвращает что-то похожее на NaN, как в примере выше.</p>
5
</ul><p>JavaScript ведет себя двояко, когда встречается с нарушениями. В некоторых ситуациях он ругается на недопустимость операции и завершается с ошибкой. В других - программа продолжает работать. В этом случае недопустимая операция возвращает что-то похожее на NaN, как в примере выше.</p>
6
<p>Каким образом JavaScript понимает, что за тип данных перед ним? Достаточно просто. Любое значение где-то инициализируется и, в зависимости от способа инициализации, становится понятно, что перед нами. Например, числа - это просто числа без дополнительных символов, кроме точки для рациональных чисел. А вот строки всегда ограничены специальными символами (в JavaScript три разных варианта). Например, такое значение '234' - строка, несмотря на то, что внутри нее записаны цифры.</p>
6
<p>Каким образом JavaScript понимает, что за тип данных перед ним? Достаточно просто. Любое значение где-то инициализируется и, в зависимости от способа инициализации, становится понятно, что перед нами. Например, числа - это просто числа без дополнительных символов, кроме точки для рациональных чисел. А вот строки всегда ограничены специальными символами (в JavaScript три разных варианта). Например, такое значение '234' - строка, несмотря на то, что внутри нее записаны цифры.</p>
7
<p>JavaScript позволяет узнать тип данных с помощью оператора typeof:</p>
7
<p>JavaScript позволяет узнать тип данных с помощью оператора typeof:</p>
8
<p>Типы данных Number, BigInt и String - это<em>примитивные</em>типы. Но есть и другие. В JavaScript встроен составной тип Object (а на его базе массивы, даты и другие). С его помощью можно объединять данные разных типов в одно значение, например, мы можем создать пользователя, добавив к нему имя и возраст:</p>
8
<p>Типы данных Number, BigInt и String - это<em>примитивные</em>типы. Но есть и другие. В JavaScript встроен составной тип Object (а на его базе массивы, даты и другие). С его помощью можно объединять данные разных типов в одно значение, например, мы можем создать пользователя, добавив к нему имя и возраст:</p>
9
<p>По-английски строки в программировании называются "strings", а строчки текстовых файлов - "lines". Например, в коде выше есть две строчки (lines), но только одна строка (string). В русском иногда может быть путаница, поэтому во всех уроках мы будем говорить<strong>строка</strong>для обозначения типа данных "строка", и<strong>строчка</strong>для обозначения строчек (lines) в файлах.</p>
9
<p>По-английски строки в программировании называются "strings", а строчки текстовых файлов - "lines". Например, в коде выше есть две строчки (lines), но только одна строка (string). В русском иногда может быть путаница, поэтому во всех уроках мы будем говорить<strong>строка</strong>для обозначения типа данных "строка", и<strong>строчка</strong>для обозначения строчек (lines) в файлах.</p>
10
<h2>undefined</h2>
10
<h2>undefined</h2>
11
<p>Объявление переменных возможно и без указания конкретного значения. Что будет выведено на экран, если ее распечатать:</p>
11
<p>Объявление переменных возможно и без указания конкретного значения. Что будет выведено на экран, если ее распечатать:</p>
12
<p>На экране появится undefined, специальное значение особого типа, которое означает отсутствие значения. Undefined активно используется самим JavaScript в самых разных ситуациях, например, при обращении к несуществующему символу строки:</p>
12
<p>На экране появится undefined, специальное значение особого типа, которое означает отсутствие значения. Undefined активно используется самим JavaScript в самых разных ситуациях, например, при обращении к несуществующему символу строки:</p>
13
<p>Смысл (семантика) значения undefined именно в том, что значения нет. Однако, ничто не мешает написать такой код:</p>
13
<p>Смысл (семантика) значения undefined именно в том, что значения нет. Однако, ничто не мешает написать такой код:</p>
14
<p>И хотя интерпретатор позволяет такое сделать, это нарушение семантики значения undefined, ведь в этом коде выполняется присваивание, а значит - подставляется значение.</p>
14
<p>И хотя интерпретатор позволяет такое сделать, это нарушение семантики значения undefined, ведь в этом коде выполняется присваивание, а значит - подставляется значение.</p>
15
<p>JavaScript - один из немногих языков, в которых в явном виде присутствует понятие undefined. В остальных языках его функцию выполняет значение null, которое, кстати, тоже есть в JavaScript.</p>
15
<p>JavaScript - один из немногих языков, в которых в явном виде присутствует понятие undefined. В остальных языках его функцию выполняет значение null, которое, кстати, тоже есть в JavaScript.</p>
16
<p><em>Вопрос на самопроверку. Почему нельзя объявить константу без указания значения?</em></p>
16
<p><em>Вопрос на самопроверку. Почему нельзя объявить константу без указания значения?</em></p>
17
<h2>Числа с плавающей точкой</h2>
17
<h2>Числа с плавающей точкой</h2>
18
<p>В математике существуют разные виды чисел, например, натуральные - это целые числа от одного и больше, или рациональные - это числа с точкой, например 0.5. С точки зрения устройства компьютеров, между этими видами чисел - пропасть. Попробуйте ответить на простой вопрос, сколько будет<em>0.2 + 0.1</em>? А теперь посмотрим, что на это скажет JavaScript:</p>
18
<p>В математике существуют разные виды чисел, например, натуральные - это целые числа от одного и больше, или рациональные - это числа с точкой, например 0.5. С точки зрения устройства компьютеров, между этими видами чисел - пропасть. Попробуйте ответить на простой вопрос, сколько будет<em>0.2 + 0.1</em>? А теперь посмотрим, что на это скажет JavaScript:</p>
19
<p>Операция сложения двух рациональных чисел внезапно привела к неточному вычислению результата. Тот же самый результат выдадут и другие языки программирования. Такое поведение обуславливается ограничениями вычислительных мощностей. Объем памяти, в отличие от чисел, конечен (бесконечное количество чисел требует бесконечного количества памяти для своего хранения).</p>
19
<p>Операция сложения двух рациональных чисел внезапно привела к неточному вычислению результата. Тот же самый результат выдадут и другие языки программирования. Такое поведение обуславливается ограничениями вычислительных мощностей. Объем памяти, в отличие от чисел, конечен (бесконечное количество чисел требует бесконечного количества памяти для своего хранения).</p>
20
<p>Рациональные числа не выстроены в непрерывную цепочку, между<em>0.1</em>и<em>0.2</em>бесконечное множество чисел. Соответственно возникает серьезная проблема, а как хранить рациональные числа? Это интересный вопрос сам по себе. В интернете множество статей, посвященных организации памяти в таких случаях. Более того, существует стандарт, в котором описано, как это делать правильно, и подавляющее число языков на него опирается.</p>
20
<p>Рациональные числа не выстроены в непрерывную цепочку, между<em>0.1</em>и<em>0.2</em>бесконечное множество чисел. Соответственно возникает серьезная проблема, а как хранить рациональные числа? Это интересный вопрос сам по себе. В интернете множество статей, посвященных организации памяти в таких случаях. Более того, существует стандарт, в котором описано, как это делать правильно, и подавляющее число языков на него опирается.</p>
21
<p>Для нас, как для разработчиков, важно понимать, что операции с плавающей точкой неточны (эту точность можно регулировать), а значит при решении задач, связанных с подобными числами, необходимо прибегать к специальным трюкам, которые позволяют добиться необходимой точности.</p>
21
<p>Для нас, как для разработчиков, важно понимать, что операции с плавающей точкой неточны (эту точность можно регулировать), а значит при решении задач, связанных с подобными числами, необходимо прибегать к специальным трюкам, которые позволяют добиться необходимой точности.</p>
22
<h2>Явное преобразование типов</h2>
22
<h2>Явное преобразование типов</h2>
23
<p>В программировании регулярно встречаются задачи, когда один тип данных нужно преобразовать в другой - например, при работе с формами на сайтах. Данные формы всегда приходят в текстовом виде, даже если значение - число. Вот как его можно преобразовать:</p>
23
<p>В программировании регулярно встречаются задачи, когда один тип данных нужно преобразовать в другой - например, при работе с формами на сайтах. Данные формы всегда приходят в текстовом виде, даже если значение - число. Вот как его можно преобразовать:</p>
24
<p>parseInt() - это функция, в которую передается значение, чтобы его преобразовать. Функция ведет себя подобно арифметическим операциям, но делает особые действия. Вот еще несколько примеров:</p>
24
<p>parseInt() - это функция, в которую передается значение, чтобы его преобразовать. Функция ведет себя подобно арифметическим операциям, но делает особые действия. Вот еще несколько примеров:</p>
25
<p>Точно так же можно преобразовать строку в число с плавающей точкой с помощью parseFloat():</p>
25
<p>Точно так же можно преобразовать строку в число с плавающей точкой с помощью parseFloat():</p>
26
26