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

Преобразование типов это процесс конвертации значения из одного типа в другой (например, строки в число, объекта к булеву значению и т.д.).

Любой тип, будь то примитив или объект, может быть преобразован в другой тип.

В JavaScript есть 3 типа преобразования:

  1. Строковое:
    • явное - функции String(value), value.toString();
    • неявное - конкатенация со строкой (с помощью бинарного + ), функция alert.
  2. Числовое:
    1. явное - функция Number(value);
    2. неявное:
      • арифметические операции (кроме бинарного +);
      • нестрогое сравнение разных типов (==, включая !=);
      • унарный оператор + (например, +’58’, +true и т.п.).
  3. Логические (булевы) преобразования:
    • явное - функция Boolean(value) (например, Boolean(‘test me’) вернет true);
    • неявное:
      1. в логическом контексте if (val) { … } или
      2. при применении логических операторов (||, &&, !).

Строковое преобразование в JavaScript

Строковое преобразование: 

  1. явное:
    • функция String(value);
    • метод toString();
  2. неявное:
    • конкатенация со строкой (с помощью бинарного + );
    • функция alert, метод toFixed() и т.п.

Особенности строкового преобразования:

  1. стандартное строковое представление пользовательского объекта - строка "[object Object]";
  2. если в объекте явно присутствует метод toString, который возвращает примитив, то он используется для преобразования;
  3. метод toString для функции выводит её код.

Примеры строкового преобразования:

Еще примеры

[свернуть]

Использование для строкового преобразования объектов метода toString

Если в объекте явно присутствует метод toString, который возвращает примитив, то именно он используется для преобразования (а не возвращает строку "[object Object]").

Результатом toString может быть любой примитив.

Метод toString не обязан возвращать именно строку. Его результат может быть любого примитивного типа. Например, это может быть число, как в примере ниже:

Поэтому мы и называем его «строковое преобразование», а не «преобразование к строке».

[свернуть]

Числовое преобразование в JavaScript

Числовое преобразование:

    1. явное: функция Number(value);
    2. неявное:
      • арифметические операции (кроме бинарного +);
      • нестрогое сравнение разных типов (==, включая !=);
      • унарный оператор + (например, +’58’, +true и т.п.);
      • функции parseInt  и parseFloat.

Подробнее обо всех операторах JavaScriptпо ссылке https://developer.mozilla.org

Особенности числового преобразования:

  1. true → 1;
  2. false → 0;
  3. undefined → NaN;
  4. null → 0 (см. исключения);
  5. “text” → NaN;
  6. "" (пустая строка) → 0;
  7. null == undefined.

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

Оператор унарный плюс + - быстрейший и предпочитаемый способ конвертирования чего-либо в число потому, что он не выполняет каких-либо операций с числом. Он может конвертировать строковые представления целых и чисел с плавающей точкой, а также нестроковые значения true, false и null. Поддерживаются числа в десятичном и шестнадцатиричном (с префиксом "0x") формате. Отрицательные числа тоже поддерживаются (но не 16-ричные). Если он не может вычислить конкретное значение, вернет NaN.

Примеры числового преобразования:

Булево (логическое) преобразование в JavaScript

  • явное - функция Boolean(value) ;
  • неявное:
    1. в логическом контексте if (val) { … } или
    2. при применении логических операторов ( || , && , ! ) (приводят значение операндов к логическому типу, но возвращают исходные операнды , которые могут иметь тип, отличный от логического).

Особенности булева преобразования:

    1. Boolean("", null, undefined, NaN, false, 0, -0) → false;
    2. Boolean(2016, ‘string’, {}, [], любой объект или массив, даже пустые) → true.

Замечание: Boolean можно заменить двойным отрицанием - !!, которое также преобразует значения к логическому типу:

Подробнее о логических операторах

Логические операторы ( || , && , ! ) обычно используются с булевыми (логическими) значениями, при этом возвращаемое ими значение также является булевым.

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

Оператор  Использование  Описание
Логическое И (&&)  expr1 && expr2 (Логическое И)

Возвращает операнд expr1, если он может быть преобразован в false; в противном случае возвращает операнд expr2 (находит и возвращает первое ложное значение либо последний операнд, когда все значения истинные).

Таким образом, при использовании булевых величин в качестве операндов, оператор && возвращает true, если оба операнда true; в противном случае возвращает false.

Логическое ИЛИ (||)  expr1 || expr2 (Логическое ИЛИ)

Возвращает операнд expr1, если он может быть преобразован в true; в противном случае возвращает операнд expr2 (находит и возвращает первое истинное значение).

Таким образом, при использовании булевых величин в качестве операндов, оператор || возвращает true, если один из операндов true; если же оба false, то возвращает false.

Логическое НЕ (!)  !expr (Логическое НЕ)

Возвращает false, если операнд может быть преобразован в true; в противном случае возвращает true.

Использование оператора || (ИЛИ) для задания значений по умолчанию:

[свернуть]
Примеры

Отсюда

Следующий код демонстрирует примеры использования оператора && (логическое И).

Следующий код демонстрирует примеры использования оператора || (логическое ИЛИ).

Следующий код демонстрирует примеры использования оператора ! (логическое НЕ).

[свернуть]

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

При сравнении примитивов (кроме !== и ===) сначала всё приводится к числу, а потом сравнивается:

Преобразование сложных типов в JS

Когда дело доходит до объектов, движок сначала приводит объекты к примитивным значениям, а уже потом выполнить финальное преобразование. Как и в случае с примитивами, объект может быть преобразован всего тремя способами (численным, строковым, булевым).

Алгоритм преобразования сложных типов (в общем случае):

  1. Если входящее значение уже является примитивом, то оно возвращается без изменений.
  2. Вызывается метод toString(), если результат вызова - примитив, то вернуть его.
  3. Вызывается метод valueOf(), если результат вызова - примитив, то вернуть его.
  4. Если ни один из методов не вернул примитив — вернуть ошибку TypeError.

При численном преобразовании сначала вызывается метод valueOf(), а уже затем toString().

При строковом преобразовании — сначала происходит вызов toString(), а уже потом valueOf().

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

Пример

[свернуть]

При логическом (булевом) преобразовании любое не примитивное значение всегда приводится к true, включая пустые объекты и массивы.

Примеры:

Подробнее о преобразовании типов - по ссылке . И ещё подробно тут.

Интересные задачи для понимания.

И ещё задачи с пояснениями.

Задачи

[свернуть]

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.