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

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

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

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

Пример:

console.log(0 || 1);
1

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

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

Пример:

console.log(0 && 1);
0

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

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

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

  • 0, '', undefined, NaN, null приводится к false. Эти значения называют falsy.
  • Всё остальное приводится к true

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

const value = name || '';
// Примеры
234 || ''; // 234
undefined || ''; // ''
'hexlet' || ''; // 'hexlet'

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

// Упс
false || ''; // ''
0 || ''; // ''

В одном из уроков мы рассмотрели операторы сравнения === и !== и упомянули, что в 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. Этим приемом иногда пользуются, чтобы поменять тип данных.

Задание

Реализуйте функцию getLetter(), которая извлекает из переданной строки указанный символ (по порядковому номеру, а не индексу) и возвращает его наружу. Если такого символа нет, то функция возвращает пустую строку.

Примеры вызова:

const name = 'Hexlet';

// Обычное обращение возвращает undefined
name[10]; // undefined

// 11 символ соответствует 10 индексу
getLetter(name, 11); // ''

getLetter(name, 1); // 'H'
getLetter(name, 0); // ''
getLetter(name, 6); // 't'

Советы


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном cообществе
Упражнение доступно только авторизованным пользователям.

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