Доброго времени суток, друзья!
В прошлом уроке мы с Вами начали знакомство с операциями, которые мы можем осуществлять над переменными с одинаковым типом. Мы познакомили с тем, что можем делать с переменными типа "Number (Число)" и переменными типа "String (Строка)", а также узнали к каким результатам ведут Логичные и Нелогичные операции с переменными этих типов.
Сегодня мы продолжим знакомится с этой темой, затроним операции с переменными более загадочного типа чем "Number (Число)" и "String (Строка)".
Начнем!
Урок 6. Операции с переменными одного типа. Часть II.
Для начала давайте снова взглянем на список с типами переменных из прошлых уроков. Вот он:
Поведение двух первых типов мы разобрали в прошлом уроке. Тип под номером 4 - Object мы разберем позже. Т.к. это один из самых интересных типов переменных. А вот оставшимися типами переменных: Boolean, Undefined и Null, мы сегодня и займемся.
Boolean (Истина - true или ложь - false).
На русском языке этот тип переменных называется Булевский или Логический. Один из моих самых любимых типов переменных. Тут все просто - всего два значения. Либо true - правда, либо false - ложь.
Давайте создадим булевскую переменную на практике, чтобы посмотреть, как это выглядит.
Откроем наши файлы index.html и core.js. Очистим core.js от предыдущего кода, и добавим следующие записи.
var isGolosCool = true;
var isGolosBad = false;
Мы создали стандартные переменные. Обе переменные имеют разные значения, но один и тот же тип.
Скажу честно, за всю мою практику программирования необходимость в арифметических операциях с переменными булевского типа мне встречалась всего пару раз. Но это не значит, что их можно откинуть за ненадобностью. Наоборот, хороший программист всегда знает, какие возможности предоставляет язык (в нашем случае JavaScript), а уж пользоваться ими или нет - сугубо личный выбор.
Для того чтобы понять логику арифметических операций с переменными булевского типа нужно проделать маленький трюк - провести в уме ассоциацию значения "true" c "1", а значения "false" c "0".
В отличие от строкового типа переменных, почти все арифметические операции с переменными булевского типа считаются допустимыми и логичными.
Давайте рассмотрим примеры на практике. Обновим наш core.js следующим кодом:
var a = true + true;
var b = true - true;
var c = true * true;
var d = true / true;
var e = false + false;
var f = false - false;
var g = false * false;
var h = false / false;
Результаты этих операций станут абсолютно понятными, если мы воспользуемся ассоциацией, о которой я писал выше. И тогда: глядя на запись вида var a = true + true;
ее можно воспринимать как var a = 1 + 1;
, а запись вида var f = false - false;
по своей сути будет идентична var f = 0 - 0;
.
С таким подходом несложно высчитать результаты всех выше перечисленных записей, и мы получим следующее:
var a = true + true;
результат - 2, тип "Number (Число)".
var b = true - true;
результат - 0, тип "Number (Число)".
var c = true * true;
результат - 1, тип "Number (Число)".
var d = true / true;
результат - 1, тип "Number (Число)".
var e = false + false;
результат - 0, тип "Number (Число)".
var f = false - false;
результат - 0, тип "Number (Число)".
var g = false * false;
результат - 0, тип "Number (Число)".
var h = false / false;
результат - NaN, тип "Number (Число)".
Из всех результатов, мне кажется, вопрос может вызвать только последний - для переменной "h".
Если мы приведем эту операцию к удобочитаемому виду, используя ассоциацию, то мы получим код вида var h = 0/ 0;
. Как мы знаем из уроков математики и из предыдущего урока, где мы рассматривали операции с переменными типа "Number (Число)" - на ноль делить нельзя. Более того, когда в прошлом уроке мы попытались поделить на ноль единицу, то мы получили в результате значение "Infinity"... Здесь же, по сути мы делаем то же самое, только делим на ноль не единицу, а такой же ноль. Но почему же мы получаем не "Infinity", а "NaN"? В чем же дело?
А дело в том, что конкретного ответа тут нет. Это казус. Доподлинно не известно почему создатели JavaScript решили, что операция 0 / 0 будет в своем результате получать "NaN", в то время, как попытка поделить на ноль любую другую цифру будет в результате получать "Infinity". Этот момент необходимо просто запомнить.
Undefined (Специфическое значение).
С этим типом переменных все просто. В предыдущих уроках мы уже с ним сталкивались. Дословно "Undefined" можно перевести как "Неизвестный, неопределенный, неустановленный". Отталкиваясь от такого перевода, логично предположить, что любые арифметические операции с этим типом переменных будут нелогичными. Посудите сами, мы же не можем сложить что-то неизвестное с таким же неизвестным, или отнять от неизвестного что-то неизвестное... В жизни такого быть не может. Однако JavaScript - очень настойчивый язык программирования. И если Вы все-таки решитесь произвести арифметические операции с переменными типа "Undefined", JavaScript и тут попробует довести их до какого-то результата. А какого именно - мы узнаем из практики.
Внесем в наш core.js код следующего вида:
var a = undefined;
var b = undefined;
var c = a + b;
var d = a - b;
var e = a * b;
var f = a / b;
alert(c);
alert(d);
alert(e);
alert(f);
Обратите внимание на две первые строчки кода. Тут мы создаем переменные, и явно указываем им значение "undefined". Тип таких, переменных так же, как и у переменных без значения будет равен "undefined".
Теперь пойдем в браузер, где открыт наш index.html и при помощи конструкции alert();
узнаем какие же результаты вернули арифметические операции с переменными типа "Undefined".
Мы видим, что все операции без исключения получили значение результата "NaN". То есть, опять же, JavaScript, получив задачу на арифметическую операцию, попытался ее выполнить, однако посмотрев в типы переменных и их значения установил, что имеет дело с "undefined": неизвестными, неопределенными, неустановленными значениями. И все что он смог сообщить нам звучит примерно, как: "Не знаю, что именно вы пытались сложить (вычесть, умножить, поделить), но получится у Вас точно не число!". Ну а тип переменных c
, d
, e
, f
когда в них записалось значение "NaN", как мы знаем из предыдущего урока будет равен "Number (Число)". И помним, что мы всегда можем это проверить конструкцией типа:
alert(typeof c);
alert(typeof d);
alert(typeof e);
alert(typeof f);
Null (Специфическое значение).
Вот, наконец, мы и добрались до еще одного специфического значения в JavaScript - Null. Давайте разберемся чем оно отличается от уже известного нам "Undefined". Различие простое: если "undefined" - это в принципе что-то неизвестное и неопределенное, и мы не можем ничего знать о неизвестном, то "Null" сообщает нам, что это нечто пустое, а знание об этом уже больше чем ничего.
Наиболее близко по своей сути к Null находится 0. Только про 0 мы еще знаем, что это цифра. А про Null мы знаем только, что оно пустое, а что именно оно такое мы не знаем.
Арифметические операции с переменными типа "Null" в отличие от операций с переменными предыдущего типа вполне себе логичны и допустимы. Чтобы понять их логику нужно "Null" проассоциировать с "0".
Проверим:
var a = null;
var b = null;
var c = a + b;
var d = a - b;
var e = a * b;
var f = a / b;
alert(c);
alert(d);
alert(e);
alert(f);
Используя нашу ассоциацию, код сверху легко может быть преобразован в:
var c = 0 + 0;
результат - 0, тип "Number (Число)".
var d = 0 - 0;
результат - 0, тип "Number (Число)".
var e = 0 * 0;
результат - 0, тип "Number (Число)".
var f = 0 / 0;
результат - NaN, тип "Number (Число)".
И вновь, единственным выпадающим из общего контекста результатом, является результат операции деления на ноль. Почему именно так, мы рассмотрели выше. Давайте удостоверимся что наша ассоциация сработала правильно, и проверим что выдаст нам браузер.
Как мы видим, ассоциация действительно работает.
Задача
var a = true + false;
var b = false - true;
var c = true * false;
var d = false / true;
- Вычислить значения результатов данных операций.
- Сначала попробовать определить результаты используя ассоциацию, описанную выше
- Удостоверится в правильности Ваших выводов, с помощью сообщений в браузере и конструкции
alert()
;
Ссылки на предыдущие уроки:
Продолжение следует...
@rassen, спасибо за ваши уроки, очень полезно. Будут крайне признателен, если поделитесь вашим опытом
https://golos.id/ru--perekvalifikacziya/@dayush/perekvalifikaciya-iz-inzhenera-prochnista-v-inzhenera-programmista-za-1-god
Пожалуйста. Поделился.
@rassen, Поздравляю!,
Ваш пост был упомянут в моем хит-параде в следующие категории:
Благодарю
Привет!
Этот пост был выбран Академией Голоса и попал в список программы поддержки качественных образовательных постов.
Ссылка на твой пост будет опубликована в отчете Академии.
Спасибо за полезный контент (ノ◕ヮ◕)ノ*:・゚✧
а мне лень всё это делать, всё оставляю на потом, забрала в избранные, может пригодиться))
Ничего не имею против такой позиции :). Сам люблю понадобавлять в избранное всего и побольше. Мысль о том, что информация полезная и, если вдруг что, то она есть у меня в закладках, меня лично успокаивает.
Великолепное объяснение. Программистом я вряд-ли стану, но вот логику (как там все изнутри устроено) понять хочется.
Програмировать как и рисовать может каждый, главное усвоить основы. Поэтому не сомневайтесь, если приложить немного усилий - все становится вполне достижимым
:) Да я и не сомневаюсь, я просто не понимаю, зачем мне программирование:))) Просто интересно так все...
Ну вот Вы сами и ответили: Зачем? - Для интереса! :)
Ну вот да!!!:))
Класс!
Подписываюсь! Не видел Вас.
Начну читать с начала. Спасибо! И - успехов!
Благодраю.
Если вдруг что-то будет не ясно - пишите в коментариях.
С радостью! Спасибо!