В JavaScript значения достаточно свободно (явно и неявно) могут быть преобразованы из одного типа в другой. Например, если какой-нибудь оператор ожидает получить значение определённого типа, а ему передаётся значение другого типа, то интерпретатор автоматически попытается выполнить преобразования к нужному типу:
Неявное преобразование – это когда интерпретатор автоматически выполняет преобразование типов, т. е. без участия программиста. Явное преобразование – это когда преобразование выполняет сам программист. Явное преобразование иначе называют приведением типов :
В таблице ниже описывается, как в JavaScript выполняется преобразование значений из одного типа в другой. Пустые ячейки соответствуют ситуациям, когда преобразование не требуется:
| Значение | Преобразование в: | |||
|---|---|---|---|---|
| Строку | Число | Булево | Объект | |
| undefined null | "undefined" "null" | NaN 0 | false false | ошибка typeError ошибка typeError |
| true false | "true" "false" | 1 0 | new Boolean(true) new Boolean(false) | |
| "" (пустая строка) "1.2" "one" "-10" "+10" "011" "0xff" | 0 1.2 NaN -10 10 11 255 | false true true true true true true | new String("") new String("1.2") new String("one") new String("-10") new String("+10") new String("011") new String("0xff") | |
| 0 -0 NaN Infinity -Infinity 3 | "0" "0" "NaN" "Infinity" "-Infinity" "3" | false false false true true true | new Number(0) new Number(-0) new Number(NaN) new Number(Infinity) new Number(-Infinity) new Number(3) | |
| <> (любой объект) | ||||
[] (пустой массив)
[9] (1 числовой элемент)
arr (любой другой массив)
function()<> (любая функция)
""
"9"
см. Преобразование объектов
см. Преобразование объектов
0
9
NaN
NaN
true
true
true
true
Для явного преобразования в простые типы используются следующие функции: Boolean() , Number() , String() . При неявном преобразования интерпретатор использует те же функции, что используются для явного преобразования.
Для явного преобразования можно использовать операторы вместо функций. Например, если один из операндов оператора + является строкой, то другой операнд также преобразуется в строку. Унарный оператор + преобразует свой операнд в число. Унарный оператор ! преобразует операнд в логическое значение и инвертирует его. Всё это стало причиной появления следующих своеобразных способов преобразования типов, которые можно встретить на практике:
Содержание
- Преобразование в числа
- Преобразование в булевы значения
- Преобразование в строки
- Преобразование простых типов в объекты
- Преобразование объектов в простые значения
- Строковое преобразование
- Численное преобразование
- Логическое преобразование
- Типы данных в JavaScript
- Оператор typeof
- Свойство constructor
- Преобразование типов в JavaScript
- Преобразование чисел в строки
- Преобразование логических значений (тип Boolean) в строку
- Преобразование даты (тип Date) в строку
- Преобразование строк в числа
- Унарный оператор +
- Преобразование логических значений (тип Boolean) в число
- Преобразование даты (тип Date) в число
- Автоматическое преобразование типов
- Автоматическое преобразование строк
- Таблица преобразования типов JavaScript
- Рекомендуем к прочтению
Преобразование в числа
Функция Number() преобразует значения по следующим правилам:
- Логические значения true и false преобразуются в 1 и 0 соответственно.
- Числа возвращаются без изменения.
- Значение null преобразуется в 0 .
- Значение undefined преобразуется в NaN .
Для строк действуют особые правила:
- Если строка содержит только цифры с начальным знаком + или — либо без знака, она всегда преобразуется в целое десятичное число. Начальные нули игнорируются, например "0011" преобразуется в 11.
- Если строка представляет собой число с плавающей точкой с начальным знаком + или — либо без знака, она преобразуется в соответствующее число с плавающей точкой (начальные нули также игнорируются).
- Если строка представляет собой число в шестнадцатеричном формате, она преобразуется в соответствующее целое десятичное число.
- Если строка пустая, она преобразуется в 0 .
- Если строка содержит что-то отличное от предыдущих вариантов, она преобразуется в NaN .
- Для объектов вызывается метод valueOf() , а возвращаемое им значение автоматически преобразуется по предыдущим правилам. Если это преобразование даёт в результате NaN , вызывается метод toString() и применяются правила преобразования строк в числа.
Унарные операторы + и — работают по тем же правилам, что и функция Number() .
Преобразование в булевы значения
Функция Boolean() преобразует значение в его логический эквивалент:
- Следующие значения в результате преобразования дают значение false : undefined , null , 0 , -0 , NaN , "" .
- Значение false возвращается без изменения.
- Все остальные значения в результате преобразования дают значение true .
Преобразование в строки
Функция String() преобразует значения по следующим правилам:
- Для всех значений кроме null и undefined автоматически вызывается метод toString() и возвращается строковое представление значения.
- Для значения null возвращается строка "null" .
- Для значения undefined возвращается строка "undefined" .
Преобразование простых типов в объекты
Для преобразования простых значений в объекты используются конструкторы Boolean() , Number() , String() :
Преобразование объектов в простые значения
Все объекты наследуют два метода преобразования: toString() и valueOf() .
Метод toString() возвращает строковое представление объекта. По умолчанию он ничего интересного не возвращает:
Некоторые типы имеют более специализированные версии метода toString() . Например, метод toString() у массива преобразует все его элементы в строки и затем объединяет их в одну строку, вставляя запятые между ними:
Задача метода valueOf() определена не так чётко: предполагается, что он должен преобразовать объект в представляющее его простое значение, если такое значение существует. Объекты по своей сути являются составными значениями, и большинство объектов не могут быть представлены в виде единственного простого значения, поэтому по умолчанию метод valueOf() возвращает не простое значение, а ссылку на него:
При преобразовании объекта в строку интерпретатор JavaScript выполняет следующие действия:
- Если объект имеет метод toString() , интерпретатор вызывает его. Если он возвращает простое значение, интерпретатор преобразует значение в строку (если оно не является строкой) и возвращает результат преобразования.
- Если объект не имеет метода toString() или этот метод не возвращает простое значение, то интерпретатор проверяет наличие метода valueOf() . Если этот метод определён, интерпретатор вызывает его. Если он возвращает простое значение, интерпретатор преобразует это значение в строку (если оно не является строкой) и возвращает результат преобразования.
- В противном случае интерпретатор делает вывод, что ни toString() ни valueOf() не позволяют получить простое значение и возбуждает ошибку TypeError .
При преобразовании объекта в число интерпретатор выполняет те же действия, но первым пытается применить метод valueOf() :
- Если объект имеет метод valueOf() , возвращающий простое значение, интерпретатор преобразует (при необходимости) это значение в число и возвращает результат.
- Если объект не имеет метода valueOf() или этот метод не возвращает простое значение, то интерпретатор проверяет наличие метода toString() . Если объект имеет метод toString() , возвращающий простое значение, интерпретатор выполняет преобразование и возвращает полученное значение.
- В противном случае интерпретатор делает вывод, что ни toString() ни valueOf() не позволяют получить простое значение и возбуждает ошибку TypeError .
Методы toString() и valueOf() доступны для чтения и записи, поэтому их можно переопределить и явно указать, что будет возвращаться при преобразовании:
Материал на этой странице устарел, поэтому скрыт из оглавления сайта.
Более новая информация по этой теме находится на странице https://learn.javascript.ru/type-conversions.
Система преобразования типов в JavaScript очень проста, но отличается от других языков. Поэтому она часто служит «камнем преткновения» для приходящих из других языков программистов.
Всего есть три преобразования:
- Строковое преобразование.
- Численное преобразование.
- Преобразование к логическому значению.
Эта глава описывает преобразование только примитивных значений, объекты разбираются далее.
Строковое преобразование
Строковое преобразование происходит, когда требуется представление чего-либо в виде строки. Например, его производит функция alert .
Можно также осуществить преобразование явным вызовом String(val) :
Как видно из примеров выше, преобразование происходит наиболее очевидным способом, «как есть»: false становится "false" , null – "null" , undefined – "undefined" и т.п.
Также для явного преобразования применяется оператор "+" , у которого один из аргументов строка. В этом случае он приводит к строке и другой аргумент, например:
Численное преобразование
Численное преобразование происходит в математических функциях и выражениях, а также при сравнении данных различных типов (кроме сравнений === , !== ).
Для преобразования к числу в явном виде можно вызвать Number(val) , либо, что короче, поставить перед выражением унарный плюс "+" :
| Значение | Преобразуется в. |
|---|---|
| undefined | NaN |
| null | 0 |
| true / false | 1 / 0 |
| Строка | Пробельные символы по краям обрезаются. Далее, если остаётся пустая строка, то 0 , иначе из непустой строки "считывается" число, при ошибке результат NaN . |
Сравнение разных типов – значит численное преобразование:
При этом строка "
0" преобразуется к числу, как указано выше: начальные и конечные пробелы обрезаются, получается строка "0" , которая равна 0 .
С логическими значениями:
Здесь сравнение "==" снова приводит обе части к числу. В первой строке слева и справа получается 0 , во второй 1 .
Специальные значения
Посмотрим на поведение специальных значений более внимательно.
Интуитивно, значения null/undefined ассоциируются с нулём, но при преобразованиях ведут себя иначе.
Специальные значения преобразуются к числу так:
| Значение | Преобразуется в. |
|---|---|
| undefined | NaN |
| null | 0 |
Это преобразование осуществляется при арифметических операциях и сравнениях > >= , но не при проверке равенства == . Алгоритм проверки равенства для этих значений в спецификации прописан отдельно (пункт 11.9.3). В нём считается, что null и undefined равны "==" между собой, но эти значения не равны никакому другому значению.
Это ведёт к забавным последствиям.
Например, null не подчиняется законам математики – он «больше либо равен нулю»: null>=0 , но не больше и не равен:
Значение undefined вообще «несравнимо»:
Для более очевидной работы кода и во избежание ошибок лучше не давать специальным значениям участвовать в сравнениях > >= .
Используйте в таких случаях переменные-числа или приводите к числу явно.
Логическое преобразование
Преобразование к true/false происходит в логическом контексте, таком как if(value) , и при применении логических операторов.
Все значения, которые интуитивно «пусты», становятся false . Их несколько: 0 , пустая строка, null , undefined и NaN .
Остальное, в том числе и любые объекты – true .
Полная таблица преобразований:
| Значение | Преобразуется в. |
|---|---|
| undefined , null | false |
| Числа | Все true , кроме 0 , NaN — false . |
| Строки | Все true , кроме пустой строки "" — false |
| Объекты | Всегда true |
Для явного преобразования используется двойное логическое отрицание !!value или вызов Boolean(value) .
В отличие от многих языков программирования (например PHP), "0" в JavaScript является true , как и строка из пробелов:
Функция Number() преобразует в тип Number, String() в тип String, Boolean() в тип Boolean.
Типы данных в JavaScript
В JavaScript существует 5 типов данных, которые могут содержать значения:
Есть 3 типа объектов:
И 2 типа данных, которые не могут содержать значения:
Оператор typeof
Чтобы определить тип переменной JavaScript, используется оператор typeof.
- У NaN тип number
- У массива тип object
- У даты тип object
- У null тип object
- У неопределенной переменной тип undefined *
- У переменной, которой не присвоено значение, тоже тип undefined *
Нельзя при помощи оператора typeof определить, является ли объект JavaScript массивом (или датой).
Оператор typeof это не переменная. Это оператор. У операторов ( + — * / ) нет типов. Однако оператор typeof всегда возвращает строку (содержащую тип операнда).
Свойство constructor
Свойство constructor возвращает функцию-конструктор у всех переменных JavaScript.
Вы можете проверить свойство constructor, чтобы определить, является ли объект массивом (содержит слово "Array"):
Или еще проще, вы можете проверить, является ли объект функцией Array:
Аналогичным образом можно проверить является ли переменная объектом Date.
Преобразование типов в JavaScript
Переменные JavaScript могут быть преобразованы в новые переменные и другие типы данных:
- при помощи функции JavaScript
- автоматически самим JavaScript
Преобразование чисел в строки
Глобальный метод String() позволяет преобразовывать числа в строки.
Его можно использовать с любыми видами чисел — константами, переменными или выражениями:
Метод toString() объекта Number делает то же самое.
В главе Методы объекта Number вы найдете другие методы, которые можно использовать для преобразования чисел в строки:
| Метод | Описание |
|---|---|
| toExponential() | Возвращает строку с округленным числом, записанным в экспоненциальной нотации. |
| toFixed() | Возвращает строку с числом, записанным с заданным количеством цифр после десятичной точки. |
| toPrecision() | Возвращает строку с числом заданной длины. |
Преобразование логических значений (тип Boolean) в строку
Глобальный метод String() позволяет преобразовывать логические значения в строки.
Метод toString() объекта Boolean делает то же самое.
Преобразование даты (тип Date) в строку
Глобальный метод String() позволяет преобразовывать дату (тип Date) в строку.
Метод toString() объекта Date делает то же самое.
В главе Методы объекта Date вы найдете другие методы, которые можно использовать для преобразования даты в строку:
| Метод | Описание |
|---|---|
| getFullYear() | Получить год в формате четырех цифр (гггг) |
| getMonth() | Получить номер месяца (0-11) |
| getDate() | Получить число месяца (1-31) |
| getHours() | Получить час (0-23) |
| getMinutes() | Получить минуты (0-59) |
| getSeconds() | Получить секунды (0-59) |
| getMilliseconds() | Получить миллисекунды (0-999) |
| getTime() | Получить время (количество миллисекунд, прошедших с 1 января 1970) |
| getDay() | Получить номер дня недели (0-6) |
Преобразование строк в числа
Глобальный метод Number() позволяет преобразовывать строки в числа.
Строки, содержащие числа (как "3.14"), преобразовываются в числа (как 3.14). Пустые строки преобразовываются в 0. Все остальные строки преобразовываются в NaN (Не число).
В главе Методы объекта Number вы найдете другие методы, которые можно использовать для преобразования строк в числа:
| Метод | Описание |
|---|---|
| parseFloat() | Парсит строку и возвращает число с плавающей точкой. |
| parseInt() | Парсит строку и возвращает целое число. |
Унарный оператор +
Унарный оператор + также можно использовать для преобразования переменных в числовой тип:
Если переменная не может быть преобразована, то она все равно станет числом, но со значением NaN (Не число):
Преобразование логических значений (тип Boolean) в число
Глобальный метод Number() позволяет преобразовывать логические значения в числа.
Преобразование даты (тип Date) в число
Глобальный метод Number() позволяет преобразовывать значения даты (тип Date) в числа.
Метод getTime() объекта Date делает то же самое.
Автоматическое преобразование типов
Когда JavaScript приходится оперировать с "неправильным" типом данных, интерпретатор попытается преобразовать тип этого значения в "правильный".
Результат получается не всегда таким, как вы ожидаете:
Автоматическое преобразование строк
JavaScript автоматически вызывает метод переменной toString(), когда вы пытаетесь "вывести" объект или переменную:
Числа и логические значения также преобразуются, но это не так заметно:
Таблица преобразования типов JavaScript
В следующей таблице показаны результаты преобразования различных значений JavaScript в типы Number, String и Boolean:
| Оригинальное значение | Преобразованное в Number | Преобразованное в String | Преобразованное в Boolean |
|---|---|---|---|
| false | 0 | "false" | false |
| true | 1 | "true" | true |
| 0 | 0 | "0" | false |
| 1 | 1 | "1" | true |
| "0" | 0 | "0" | true |
| "000" | 0 | "000" | true |
| "1" | 1 | "1" | true |
| NaN | NaN | "NaN" | false |
| Infinity | Infinity | "Infinity" | true |
| -Infinity | -Infinity | "-Infinity" | true |
| "" | 0 | "" | false |
| "20" | 20 | "20" | true |
| "twenty" | NaN | "twenty" | true |
| [] | 0 | "" | true |
| [20] | 20 | "20" | true |
| [10,20] | NaN | "10,20" | true |
| ["twenty"] | NaN | "twenty" | true |
| ["ten","twenty"] | NaN | "ten,twenty" | true |
| function()<> | NaN | "function()<>" | true |
| NaN | "[object Object]" | true | |
| null | 0 | "null" | false |
| undefined | NaN | "undefined" | false |
Значения в кавычках показывают строковые значения.
Красным цветом выделены значения, которые не всегда ожидаемы.





