«Единственный способ творить великие дела – это любить то, что ты делаешь»
JavaScript

Игра на «Морской Бой» на JavaScript: Простая Игра и Игра для Двоих


Здесь продолжается разговор о приведении типов в JavaScript. Что такое преобразование и приведение типов? В чем их отличие?

Типы и преобразования между ними - это один из фундаментальных аспектов в программировании. Это то, что мы делаем в каждом языке программирования. Например, преобразовываем строку в число, или число в логическое значение. Это то, что мы делаем постоянно. Важно знать об этом, прежде чем двигаться дальше в изучении языка.

Эта тема особенно актуальна для такого языка, как JavaScript, который порой ведет себя странным образом, как мы увидим дальше. И понять это порой не так просто, как может показаться на первый взгляд.

Преобразование типов (Type Conversion) - это когда мы вручную конвертируем один тип в другой. И другое дело...

Приведение типов (Type Coercion) - это когда Javascript автоматически преобразует типы, и мы этого не видим. Это происходит не явно, выполняется скрытно от нас и это необходимо в некоторых ситуациях. Здесь мы рассмотрим примеры приведения типов в Javascript (частично о преобразовании и приведении типов речь шла в этой статье).



Преобразование типов

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

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

Введенные данные обычно приходят в виде строк.

Пример 1.1

const inputYear = '1991' /* This is string */

Теперь, если мы хотим проделать какие-либо вычисления с этой строкой/с этими данными, то это не будет работать.

Давайте проверим: допустим, нам нужно вычислить год, когда пользователю исполнится 18 лет.

Пример 1.2

const inputYear = '1991' /* This is string */
console.log(inputYear + 18);

В результате мы получим строку: математического сложения не произойдет.

199118

Следует запомнить, что если мы, имея строку, добавляем/прибавляем к ней что-либо, используя знак сложения "+", то происходит объединение строк (подробнее про объединение строк).

Какой же выход из подобных ситуаций? Нужен способ конвертации строк в числа.

Преобразование строки в число - Функция Number

Для конвертации строки в число, используется встроенная в JavaScript функция Number. Вот как это делается:

Пример 2.1

const inputYear = '1991'
console.log(inputYear); /* This is string */
console.log(Number(inputYear)); /* This is number */

В консоли строки и числа имеют разный цвет. По умолчанию: число имеет фиолетовый цвет, а строка черный. Если же выбрать темную тему для браузера, то число все также будет иметь фиолетовый цвет, а строка белый. Цвета могут меняться с течением времени, но в любом случае цвет для строк и чисел различный.

Что же касается функции Number, то, что такое функция и почему это работает именно так, мы будем изучать в следующем разделе.

Сейчас нужно знать лишь, что для конвертации строки в число используется функция Number - так как это было продемонстрировано в примере выше.

Number(inputYear) - эта операция возвращает строку в виде числа или: функция Number преобразует переданное значение в число.

Важное замечание: исходное значение не конвертируется. То есть в нашем случае - в нашем примере переменная inputYear так и остается строкой. Ее значение остается неизменным: '1991'.

И, соответственно, любые вычисления с исходной переменной проводятся, как со строкой:

Пример 2.2

const inputYear = '1991'
console.log(inputYear); /* This is a string */
console.log(Number(inputYear)); /* This is a number */
console.log(inputYear + 18); /* It's still a string */

Результат

1991
1991
199118

Если же сделать так:

Пример 2.3

const inputYear = '1991'
console.log(inputYear); /* This is a string */
console.log(Number(inputYear) + 18); /* This is a number */

Результат

1991
2009

В результате произошло математическое сложение. Исходное значение преобразовано в число.

Не число NaN - Преобразование строки в число

С преобразованием строк, содержащих числовые значения все довольно просто.

Если же пробовать преобразовать в число что-либо другое, например строку, которая не содержит число, то это не возможно будет конвертировать:

Пример 3.1

console.log(Number('Marry'));

Результат


NaN

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

Javascript выдает нам NaN, а не числовое значение всякий раз, когда операция, включающая числа, не дает нового числа (NaN - Javascript gives us this, not a number value whenever an operation that involves numbers fails to produce a new number - немного запутанный перевод, но дальше должно быть все ясно).

NaN (не число) означает недопустимое/недействительное число.

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

Мы можем проверить, к какому типу данных относится не число NaN? Воспользуемся оператором typeof.

Пример 3.2

console.log(typeof (NaN));

Результат


number

Результат оказался неожиданным - number. Это означает, что NaN (не число) в действительности является числом, так как относится к числовому типу данных.

Но опять же NaN (no a number) "не число" в действительности означает invalid number (invalid - недействительный, invalid number - недопустимое число) недопустимое/недействительное число.

Итак, NaN почему-то все еще число/какое-то число, так как относится к числовому типу данных number, но оно недействительное (it's still a number of somehow, but it's an invalid one).

Еще раз: мы получаем не число, когда операция с числами не может дать нам новое число (we get not a number whenever an operation involving numbers fails to give us a new number).

Функция String - Преобразование чисел в строки

Изложенный выше материал касался преобразования строк в числа. Конечно же, мы можем делать противоположные операции: преобразовывать числа в строки. Условно можно сказать, что это чуть менее важно, чем конвертация строк. Но давайте посмотрим, как это работает.

Для преобразования в строку, используется встроенная в JavaScript функция String:

Пример 4.1

console.log(String(33));

Результат

33

В результате мы получили строку. Это видно и по цвету. Как уже упоминалось в этой статье: в консоли цвет чисел и строк отличен. Число имеет фиолетовый цвет, а строка белый для темной темы (как в нашем случае) или черный для светлого фона.

Для наглядности сделаем так:

Пример 4.2

console.log(String(33), 33);

Результат

33 33

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

Сегодня JavaScript может преобразовывать только два/три типа. Мы можем конвертировать в число, в строку или в логический/булев тип данных. Но мы не можем, например, преобразовать что-либо в undefined. В этом нет особого смысла.

Итак, здесь мы занимались преобразованием строк и чисел друг в друга. Но не было работы с логическим типом данных. Потому что булевы значения ведут себя особым образом. Для этого существует отдельная лекция, посвященная "истинным" и "ложным" значениям.

Это был материал о преобразовании типов, где мы вручную конвертировали один тип данных в другой.

Приведение типов

На практике, не всегда преобразование типов нужно делать вручную. Во многих ситуациях Javascript делает это за нас - преобразование типов происходит автоматически. Это называется «Приведением типов»

Об этом пойдет речь далее.

В основном приведение типов происходит всякий раз, когда работа проводится с двумя переменными, относящимися к различным типам данных. Тогда Javascript будет за кулисами преобразовывать одно из значений, чтобы оно соответствовало другому значению так чтобы, в конце концов, операция была выполнена.

В действительности, если об этом задуматься мы всегда "видим" (т.е. это можно понять), что происходит. Далее рассмотрим примеры приведения типов.

Сложение - Преобразование чисел в строки

О сложении чисел и строк уже шла речь. Тем не менее, начнем именно с этого:

Пример 5.1

console.log('I am ' + 23 + ' years old');

Результат

I am 23 years old

В итоге мы видим строку 'I am 23 years old' - это ожидаемый результат. Но все же не лишним будет повторить, как это работает?

Итак, в примере мы имеем дело с различными типами данных. 'I am', 'years old' - это строки, а 23 - это число. JavaScript совмещает строки с числом и выдает результат в виде единой строки. Происходит это благодаря приведению типов - при этом JavaScript автоматически преобразует типы из одного в другой.

В JavaScript оператор сложения (знак плюс "+") вызывает приведение числа к строке. И всякий раз, когда операция сложения происходит между числом и строкой, число будет конвертировано в строку.

Благодаря приведению типов следующие две записи идентичны:

Пример 5.2

console.log('I am ' + 23 + ' years old');
console.log('I am ' + '23' + ' years old');

Итак, еще раз: оператор сложения (плюс "+") конвертирует число в строку. То же самое происходит в шаблонных литералах, где все числовые значения преобразуются в строки.

Если бы JavaScript не имел автоматического приведения типов, как во многих других языках программирования, то нам вручную пришлось бы преобразовывать числа в строки (мы уже делали это ранее в этой статье). В этом случае код нашего примера выглядел бы так:

Пример 5.3

console.log('I am ' + String(23) + ' years old');

Но хорошо, что в JavaScript есть приведение типов и поэтому преобразования происходят автоматически и незаметно для нас.

Вычитание - Преобразование строк в числа

Не все операторы способствуют тому, что приведение типов конвертирует числа в строки. Рассмотрим пример с вычитанием.

Пример 6.1

console.log('23' - '10' - 3);

Результат

10

В этом примере JavaScript преобразовал строки в числа. Это означает, что оператор минус способствует обратному преобразованию: при вычитании происходит конвертация строк в числа.

И если же в примере использовать плюс:

Пример 6.2

console.log('23' + '10' + 3);

Результа

23103

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

Это очень важное отличие, которое нужно иметь в виду: «плюс» и «минус». При сложении числа преобразуются в строки, а при вычитании наоборот строки в числа. И это своего рода конфуз для начинающих разработчиков, тем более, если они еще об этом не знают.

Умножение и деление - Преобразование строк в числа

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

Пример 7.1

console.log('23' * '2');

Результат

46

И пример с делением.

Пример 7.2

console.log('46' / '2');

Результат

23

Логические значения - Преобразование строк в числа

Рассмотрим пример с логическими значениями.

Пример 8.1

console.log('23' > '18');

Результат


true

Строка '23' больше строки '18' и это 'Истина', так как число 23 больше чем 18. В этом примере JavaScript все также автоматически конвертирует строки в числа.

Таким образом, JavaScript во всех случаях, кроме сложения преобразует строки в числа.

Примеры приведения типов

Для укрепления пройденного материала рассмотрим примеры приведения типов.

Пример 9.1

let n = '1' + 1;
n = n - 1;
console.log(n);

Результат

10

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

let n = '1' + 1; - здесь вторая единица конвертируется в строку '1' и в итоге будет получена строка '11'.

n = n - 1; - здесь строка '11' преобразуется в число 11 ,поэтому в результате мы увидим число 10.

Пример 9.2

console.log(2 + 3 + 4 + '5');

Результат

95

Здесь самостоятельно нужно разобраться, почему в итоге мы видим 95. И это строка.

Пример 9.3

Если же сделать так:


console.log('5' + 2 + 3 + 4);

Результат будет иным:

5234
Пример 9.4

console.log('10' - '4' - '3' - 2 + '5');

Результат

15

Теперь, если вы разобрались с этими примерами, все должно быть довольно ясно. Это хорошо, что вам известно о правилах приведения типов сразу/с самого начала. И вы можете писать свой код, помня об этом.

Многие люди не знают об автоматическом преобразовании типов или считают плохой практикой полагаться на приведение типов. Одна из причин этого заключается в том, что, по их мнению, приведение типов может на самом деле привнести много непредвиденных ошибок в код программы.

Однако это может произойти только тогда, когда мы действительно не понимаем и не знаем что делаем, когда мы не знаем материала, представленного в этой статье. Если же вам известно как происходит приведение типов в JavaScript, то вы легко избежите вероятных ошибок.

По мнению автора курса приведение типов это хороший механизм, который позволяет нам писать намного меньше кода, а также писать более читабельный код. Со временем, продолжая изучать JavaScript, вы лучше поймете, как работает приведение типов, и легко будете применять этот инструмент в свое коде.



Читайте также...



Отзывы и комментарии:

Комментариев нет...

Оставить отзыв:

Ваше Имя:

Текст комментария:

Ответьте на вопрос:

Сколько дней в Високосном году?


НЕ Рунет - Часть 1

Тематические публикации
Популярные заметки
Последние заметки