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


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

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

Прямое преобразование выполняет функция

String(value)
или
value.toString();

Вообще .toString(); предназначен для объектов, но и примитивные типы данных он тоже преобразовывает

String(123)   // "123"
String(false)   //  "false"
String(null)   //  "null"
String(NaN)   //  "NaN"
String(undefined)   //  "undefined"


Так же всё, к чему прибавляется строка, превращается в строку
Поэтому для преобразования к строке можно добавить пустую строку

123 + "" // "123"
1 + "2" + 3 // "123"
но
1 + 2 + "3" // "33" - вначале сложили два числа 1 и 2, потом к ним прибавилась строка

Строку выводит функция alert
alert( 123 ) // "123"

Строку возвращает prompt

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

Прямое преобразование выполняет функция

Number(value)

Number("42")   // 42

Непрямое преобразование - все математические операторы и операторы сравнения, кроме сложения со строкой и сравнения двух строк

"1" - "0" // 1, потому что 1 - 0 = 1
"2" > 1   // true, потому что 2 > 1

Преобразование к числу выполняет унарный плюс

+"123"   // 123
+"1" + +"2"  // 3, потому что 1 + 2 = 3

Преобразование к числу идёт вот по такой схеме:

null - 0
undefined - NaN // да, это контринтуитивно и  нужно запомнить, что undefinedк приведённый числу даёт NaN
true and false 1 and 0
string - пробелы по краям убираются, если остаётся пустая строка - 0, иначе число в строчном виде преобразуется в число. Любые сторонние символы, кроме точки, минуса и перевода строки \n, преобразуют это число в NaN

Кстати, унарный плюс переводит научную запись числа в обычную

+2e4 //  20000

а шестнадцатеричное число в число в десятичной системе

+"0xff" // 255


Задача
Что выведет данный код

true > false // true, 1 > 0
true - false // 1, 1 - 0 = 1
true + NaN // NaN
true + undefined // NaN

К числу преобразует оператор ==, если он применяется к значениям разных типов

Исключение:

null == undefined // true

Это прописано в спецификации - при сравнении  null и undefined преобразования типов нет и эти значения равны друг другу и не равны никакому другому. кроме самих себя

В остальных случаях преобразование есть

1 == true  // true
1 == "true" // false - строка "true" при преобразовании к числу превратилась в NaN

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

Прямое преобразование
Boolean(value)

Если используется в конструкциях if ( ... ), while( ... ) и в операторах !, &&, ||

К false преобразуются
  • null, undefined
  • 0
  • "" - пустая строка
  • NaN

Всё остальное true, в том числе
  • "0" - строка с нулём
  • " " - строка с пробелом
  • [] - пустой массив
  • {} - пустой объект

Ещё один способ преобразования к булеву значению - двойное отрицание
!!NaN // false - первое отрицание приводит к булеву значению, но меняет на противоположное. второе отрицание возвращает исходное значение

И совсем загадочный случай
NaN, которое не равно ничему другому в том числе самому себе

NaN == NaN // false



Дополнительно

Преобразование букв в кодировку ASCII

Для перевода символов в кодировку ASCII используется функция .charCodeAt()

    "a".charCodeAt(); // 97
    "A".charCodeAt(); // 65
    "а".charCodeAt(); // 1072 - удивлены? секрет прост: в первой строке а в латинской раскладке, в третьей - в кириллической

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

Перевод в разные системы счислений

Перевести число из десятичной в другую систему счисления позволяет функция .toString(n); где n - основание системы счисления

    (7).toString(2);      // "111"

Перевод числа в десятичную систему счисления - функция parseInt("...", m), где m указывает из какой системы осуществляется перевод в десятичную

    parseInt(111, 2);   // 7

Перевести число из любой системы m в любую систему n позволяет комбинация этих двух функций

    parseInt("...", m).toString(n); 
 
Например, переведём 111 из двоичной системы в десятеричную

    parseInt(111, 2).toString(10);   

Функция .toString(n); переводит только числа и возвращает строку, функция parseInt("...", m); принимает и числа и строки и возвращает число.

Дополнено