☕ 5+5=? Преобразование значений в строку или число в JavaScript

В языке JavaScript данные можно преобразовывать автоматически либо с помощью функций. В статье узнаем, как работают способы преобразования данных в JS и почему при сложении 5 и 5 мы можем получить 55 вместо 10.
☕ 5+5=? Преобразование значений в строку или число в JavaScript

Разберем пример:

        var a = 5; //число
var b = "5"; //строка
var c = a + b; 
alert(c);//выведет 55
alert(typeof(c))// выведет string

    

Когда мы складываем 5 и 5, то ожидаем увидеть вывод — 10. Однако, получаем 55 и видим, что тип данных — не число, а строка.

Язык JavaScript автоматически преобразовал переменную a в строку и соединил ее с переменной b в одну строку.

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

Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека фронтендера»

Преобразование в строку в JavaScript

Чтобы преобразовать число в строку используют функцию String().

Например:

        var a = 5; //число
a = String(a);//преобразует переменную а в строку
alert(typeof(a));//выведет string
    

Преобразование в число в JavaScript

Чтобы преобразовать данные в число используют функцию Number(). Попробуем преобразовать строковое значение 5 в число.

        var a = "5";//строка
a = Number(a); //преобразует переменную а в число
alert(typeof(a));//выведет number

    

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

Например:

        var a = "5"; //строка
var b = "5"; //строка
var c = a/b; 
alert(c);//выведет 1, что мы и ожидаем при делении 5 на 5
alert(typeof(c));// выведет number

    

Логическое преобразование в JavaScript

Для логического преобразования используют функцию Boolean().

Данные типа пустая строка, NaN, undefined, null — преобразуются в false.

Все остальные данные: числа и строки, преобразуются в true.

Например:

        var a = "null";
alert(Boolean(a));//выведет false

    
        var a = "0";
alert(Boolean(a));//выведет true

    
        var a = " ";//пробел
alert(Boolean(a));//выведет true

    
        var a = "";//пусто, без пробелов и других знаков
alert(Boolean(a));//выведет false

    

Подведем итоги

JavaScript может преобразовывать данные автоматически:

  • число преобразуются в строки, если их использовать в выражениях со строкой;
  • если в строках находятся числа и с ними выполняют математические операции, то они преобразуются в числа.

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

  1. String() — преобразует данные в строки.
  2. Number() — преобразует данные в числа.
  3. Boolean() — преобразует данные в логические значения true или false.

Материалы по теме

Комментарии

 
 
26 июня 2023

В это статье описывают только "симптомы" поведения. по настоящему если хотите узнать почему 1+"1"="11" то узнайте про:

  1. Прототипы
  2. Проиотипная модель наследования
  3. "Дефолтное" поведение методов для приведения типа в другой тип
  4. Изменение "дефолтного" поведения методов в рамках типа или экземпляра этого типа.

А ещё можете почитать про JsFuck Она покажет на реальных примерах приведение типа. Для примера: Как только с помощью таких символах как []()!+ Получить строку со значением 'e'?

Ответ: (!![]+[])([!+[]+!+[]+!+[]])

Объяснение: Разберемся с первой группой (скобки) Начнем с пустого массива. Если вызвать пустой массив то логично получим этот пустой массив. Но что будет если попробовать использовать унарный оператор НЕ (!)? выведет false. Почему? Потому что при попытке приведения Exotic Object Array в Boolean type мы получаем true. А унарный оператор "разворачивает" вычисленное значение. и поэтому делаем еще один ! чтобы получить true.

Следующее: Почему потом !![] (как мы уже выяснили это true) это все снова прибавляется к массиву. При попытке Boolean прибавить Exotic Object Array неимеющим свойтсв срабатывает специальный метод прописанный в js и который описан в актуальной спецификации (как и все что я здесь говорю) и который в итоге возвращает пустую строку "". В итоге: true+""="true". Все это нужно было для того чтобы получить строку со значением "true" чтобы потом получить уже по индексу только строку со значением e.

Сокращая мы можем сделать так: (!![]+[])[3] Но нам нельзя использовать числа, так что надо сделать по другому. Зная что мы можем получить true то несложно предположить что 1 это true а 0 это false. И как же получить 1? надо использовать оператор "присвоения" (в спецификации он описан как Addiction expression если не ошибаюсь) То есть делаем: +(!![]) В итоге получается 1 а 1+1+1=3 так что надо просто повторить его 3 раза и получим строку со значением e

14 июня 2022

в подведении итогов перепутали какая функция преобразует в строку, а какая в число

15 мая 2022

В первом примере кода С пропущено. var C должно быть.

Да и что за вар в наши дни.

15 июня 2022

согласен, но есть моменты, когда так нужно сделать. Например, я решал задачу на Яндекс практикуме про видимость переменных в функциях. Задача оказалась тривиальной: нужно было заменить let на var. Как оказалось, это работает. Но в целом, да, от var уйти пора

var не устарел, у него свои области применения. для примера почему var лучше в некоторых ситуациях:

  1. меньше проверок Static Semantics( у let около 4~, у var 0. это сокращает время выполнения кода)
  2. область видимости привязана к environment функции (можно сказать что это минус. возможно да, можно назвать все минусом если вы не умеете этим пользоваться) В итоге - мы получаем такой индефикатор (переменную если по простому) которая как бы "перекладывает" ответственность в корректности кода на разработчика. Это даёт ускорение выполнения кода, во много раз больше (если не учитывать всякие оптимизации движков). То есть var не устарел, у него просто другое применение. И если вы хотите оптимизировать приложение то вам необходимо и обязательно использовать var в разных случаях
15 мая 2022

Можно также упомянуть, что преобразовать значение в строку добавив пустую строку(1+""), а в число с помощью унарного + (+"1")

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

LIVE >

Подпишись

на push-уведомления