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

JavaScript. Преобразование типов данных. Явное и неявное преобразование объектов в простые значения

JavaScript. Преобразование типов данных

» » Сообщение:

JavaScript может гибко преобразовывать один тип в другой.
Например, везде, где интерпретатор JavaScript ожидает получить логическое значение, можно указать значение любого типа и JavaScript автоматически (неявно) выполнит необходимое преобразование.
Одни значения (истинные) преобразуются в значение true, а другие (ложные) - в false.

Тоже самое относится и к другим типам: если интерпретатор ожидает получить строку, он автоматически преобразует любое другое значение в строку. Если интерпретатор ожидает получить число, он попробует преобразовать имеющееся значение в число (в случае невозможности такого преобразования будет получено значение NaN). Таким образом, если операторы и инструкции JavaScript ожидают получить значения определённых типов, интерпретатор попытается выполнить неявное преобразования в необходимые типы.

Например:

script Код: Выделить всё Развернуть
10 + " машин" // => "10 машин". Число преобразуется в строку
'7' * '4'     // => 28. Обе строки преобразуются в числа
1 - "x"       // => NaN. строка "x" не может быть преобразована в число

При выполнении автоматического преобразования типов интерпретатор используется те же функции, что используются для явного преобразования: Boolean(), Number(), String().

В таблице ниже описывается, как в 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"
используется метод join()
см. Преобразование объектов
см. Преобразование объектов
0
9
NaN
NaN
true

true
true
true
true

Явное преобразование

Несмотря на то что многие преобразования типов JavaScript выполняет автоматически, иногда может потребоваться выполнить преобразование явно.
Простейший способ выполнить преобразование явно заключается в использовании функций Boolean(), Number(), String():

script Код: Выделить всё Развернуть
Number("3")    // 3
String(false)  // "false"
Boolean([])    // true

Определённые операторы в JavaScript неявно выполняют преобразование и иногда разработчики используют их для явного преобразования.
Если один из операндов оператора + является строкой, то другой операнд также преобразуется в строку.
Унарный оператор + преобразует свой операнд в число. А унарный оператор ! преобразует операнд в логическое значение и инвертирует его. Всё это стало причиной появления следующих своеобразных способов преобразования типов, которые можно встретить на практике:

script Код: Выделить всё Развернуть
x + ""  // То же, что и String(x)
+x      // То же, что и Number(x). Можно также встретить x - 0
!!х     // то же, что и Boolean(x)

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

Функция Number() преобразует значения по следующим правилам:

  • Логические значения true и false преобразуются в 1 и 0 соответственно.
  • Числа возвращаются без изменения.
  • Значение null преобразуется в 0.
  • Значение undefined преобразуется в NaN.

Для строк действуют особые правила:

  • Если строка содержит только цифры с начальным знаком «плюс» или «минус» либо без знака, она всегда преобразуется в десятичное число.
  • Если строка содержит значение с плавающей точкой в правильном формате, она преобразуется в соответствующее число с плавающей точкой.
  • Если строка содержит шестнадцатеричное значение в правильном формате, она преобразуется в соответствующее целое число.
  • Если строка пустая, она преобразуется в 0.
  • Если строка содержит что-то отличное от предыдущих вариантов, она преобразуется в NaN.

Для объектов вызывается метод valueOf(), а возвращённое им значение преобразуется по предыдущим правилам.
Если это преобразование даёт в результате NaN, вызывается метод toString() и применяются правила преобразования строк в числа.
Преобразование в строки

Функция String() всегда возвращает строку независимо от полученного значения.
Она работает следующим образом:

  • Если у значения есть метод toString(), он вызывается (без аргументов), а затем возвращается результат.
  • Для значения null возвращается строка "null".
  • Для значения undefined возвращается строка "undefined".

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

Функция Boolean() преобразует значение в его логический эквивалент.
Она работает следующим образом:

  • Следующие значения в результате преобразования дают значение false: undefined, null, 0, -0, NaN, "".
  • Все остальные значения при преобразовании дают в результате значение true.

Преобразование простых значений в объекты

Для преобразования простых значений в объекты используются конструкторы Boolean(), Number(), String():

script Код: Выделить всё Развернуть
var oNum = new Number(3);
var oStr = new String("1.2");
var oBool = new Boolean(true);
 
alert(typeof oNum);
alert(typeof oStr);
alert(typeof oBool);

Преобразование объектов в простые значения

Все объекты наследуют два метода преобразования: toString() и valueOf().

Метод toString() возвращает строковое представление объекта.
По умолчанию он ничего особенно интересного не возвращает:

script Код: Выделить всё Развернуть
({x: 1, y: 2}).toString();  // "object Object"

Многие типы имеют более специализированные версии метода toString(). Например, метод toString() типа Array преобразует все элементы массива в строки и объединяет результаты в одну строку, вставляя запятые между ними.

script Код: Выделить всё Развернуть
var a = [1,2,3];
document.write(a);

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

script Код: Выделить всё Развернуть
alert(typeof ({x:2}).valueOf());   // object

При преобразовании объекта в строку интерпретатор JavaScript выполняет следующие действия:

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

При преобразовании объекта в число интерпретатор выполняет те же действия, но первым пытается применить метод valueOf():

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

Методы toString() и valueOf() доступны для чтения и записи, поэтому в объектах можно переопределить преобразование в простое значение:

script Код: Выделить всё Развернуть
var obj1 = {};
var obj2 = {};
obj1.toString = function() { return "Это мой объект"; };
javascript, true, false, boolean, number, string, valueof, tostring, undefined, typeerror



Похожие темыКомментарии ПросмотрыПоследнее сообщение
0648JavaScript. Логические операторы и ...
Сообщение от: Admin
0929Обход child nodes - потомков элемен...
Сообщение от: Admin
3900BBComplex - Классы для каскадных та...
Сообщение от: Admin
0634Колонки одинаковой высоты - лучшее ...
Сообщение от: Admin
0463JavaScript методы alert, document.w...
Сообщение от: Admin