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

В этой главе:

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

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

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

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

В таблице ниже описывается преобразование значений из одного типа в другой. Пустые ячейки соответствуют ситуациям, когда преобразование не требуется. Строки, которые могут быть преобразованы в числа, преобразуются в числа. В строке допускается наличие пробельных символов в начале и в конце, но присутствие других непробельных символов, которые не могут быть частью числа, при преобразовании приводят к возврату значения NaN. Преобразование объектов в простые типы будет подробно описано ниже.

Значение

Преобразование в:

Строку

Число

Булево

Объект

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"

"15/"

 

0

1.2

NaN

NaN

false

true

true

true

new String("")

new String("1.2")

new String("one")

new String("15/")

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 элементом)

['a']

function(){} (любая функция)

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

""

"9"

используется метод join()

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

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

0

9

NaN

NaN

true

true

true

true

true

 

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

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

1
2
3
4
Number("3")    // => 3
String(false// => "false"
Boolean([])    // => true
Object(5)      // => new Number(5)

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

1
2
3
x + ""  // То же, что и String(x)
+x      // То же, что и Number(x). Можно также встретить x - 0
!!х     // то же, что и Boolean(x)

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

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

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

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

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

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

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

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

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

  • В противном случае возбуждается исключение TypeError.

По умолчанию методы не возвращают ничего особенно интересного:

1
({x:1, x:2}).to String()  // => '[object Object]'

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

1
2
var a = [1,2,3];
document.write(a);

Метод toString() объекта Function возвращает строковое представление функции, зависящее от её реализации. На практике обычно возвращается код функции:

1
2
function foo() { alert("hi!"); }
document.write(foo);

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

1

2

3

4

5

var obj1 = {};
var obj2 = {};
obj1.toString = function() { return "Это мой объект"; }
 
document.write(obj1 + "<br>" + obj2);