Преобразование типов
Тип данных может меняться как самопроизвольно в процессе выполнения кода, так и в результате использования предназначенных для этого функций.
Рассмотрим преобразование примитивных типов данных
Преобразование к строке
Прямое преобразование выполняет функция
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); принимает и числа и строки и возвращает число.
Дополнено