Слабая типизация

В модуле «Арифметика» мы затронули тему слабой типизации.

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

Особенно много автоматических преобразований происходит при работе с логическими операциями.

Пример:

console.log(0 || 1);
1

Что тут произошло:

Оператор ИЛИ работает так, что его выполнение (слева на право) прерывается и возвращается результат первого аргумента, который можно преобразовать в true.

Пример:

console.log(0 && 1);
0

Что тут произошло:

Оператор И работает так, что его выполнение (слева на право) прерывается и возвращается результат первого аргумента, который можно преобразовать в false.

В JavaScript есть два простых правила, по которым происходят преобразования:

  • 0, '', undefined превращаются в false
  • Всё остальное превращается в true
  • null это особый тип данных, который не преобразуется
console.log(true);
true
console.log(null);
null

В одном из уроков мы рассмотрели операторы сравнения === и !== и упомянули, что в JavaScript так же есть операторы == и !=, но их не стоит использовать. Отличия как раз заключаются в преобразовании типов:

console.log('' === false); // => false
console.log('' == false);  // => true

Пустая строка и false — это разные значения, поэтому оператор === говорит «ложь! они не равны!».

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

Это преобразование неявное, поэтому по возможности избегайте операторов == и !=.


Вспомните операцию отрицания:

const answer = true;
console.log(!answer);  // => false

При двойном отрицании !! итоговое значение равно начальному:

const answer = true;
console.log(!!answer);  // => true

Но здесь дополнительно происходят преобразования типа. Поэтому результатом двойного отрицания всегда будет bool. Этим приемом пользуются, чтобы поменять тип данных.


В разных языках программирования разные правила преобразований. Некоторые языки вообще не преобразовывают типы сами.

Задание

Напишите функцию isFalsy, которая проверяет, трактуется ли переданное значение как ложное с точки зрения JavaScript. Для выполнения этой проверки вам понадобится сравнить false с переданным значением, используя ==.


Советы


Нашли ошибку? Есть что добавить? Пулреквесты приветствуютсяhttps://github.com/hexlet-basics

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

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