# Автоматическое преобразование типов данных

Как вы уже знаете, строки в JavaScript следует брать в кавычки. Может быть такое, что всеми символами строки будут являться цифры:

`let a = '123';`

В этом случае переменная `a` также является строкой, но с некоторым нюансом.

Суть нюанса в следующем: если над строкой с цифрами выполнить какую-либо математическую операцию - эта операция будет выполнена так, будто у нас действительно числа, а не строки:

`alert('2' * '3'); // выведет 6`

В данном случае JavaScript видит, что мы пытаемся выполнить недопустимую для строк, но допустимую для чисел операцию.

Он также видит, что фактически наши строки - это числа в кавычках. Поэтому JavaScript автоматически выполняет преобразование этих строк к числам и выполняет соответствующую математическую операцию над ними.

Такое работает, если в наших строках только цифры. Если там будет хотя бы одна буква - JavaScript посчитает операцию некорректной и сделает ее результатом значение `NaN`:

`alert('2' * '3s'); // выведет NaN`

Кроме того, автоматическое преобразование происходит, если операция математически корректна, но недопустима для строк.

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

Однако, строки, как и числа, складываются с помощью оператора `+`. Это значит, что в случае сложения автоматического преобразования не будет:

`let a = '1' + '2'; alert(a); // выведет '12' - произошло сложение строк`

Если одно из слагаемых число, а другое - строка, то всегда побеждает строка:

`let a = 1 + '2'; alert(a); // выведет '12'`

В таких случаях JavaScript, наоборот, автоматически преобразует числа в строки и выполняет сложение строк.

Есть, однако, нюансы, когда слагаемых больше, чем два: в этом случае преобразование к определенному типу зависит от порядка выполнения операций.

В следующем примере вначале `2` и `3` сложатся как числа, а затем результат прибавится к строке `'1'` уже как строка `'5'`, что в итоге даст строку `'15'`:

`let a = '1' + (2 + 3); alert(a); // выведет '15'`

Если же убрать скобки, то все будет складываться слева направо. То есть сначала к строке `'1'` прибавится число `2` и в результате получится строка `'12'`. Затем к этой строке прибавится число `3` и в результате получится строка `'123'`:

`let a = '1' + 2 + 3; alert(a); // выведет '123'`

А вот в следующем примере числа `2` и `3` написаны в начале, поэтому сначала они сложатся как числа, дав в результате число `5`, а затем к этому числу прибавится строка `'1'`, дав в итоге строку `'51'`:

`let a = 2 + 3 + '1'; alert(a); // выведет '51'`

Не запуская код, определите, что выведется на экран:

`let a = '5' + '2'; alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = '5' + 2; alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = 5 + '2'; alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = 5 + 2; alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = '5' * '2'; alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = '5' - '2'; alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = '5' / '2'; alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = '5' % '2'; alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = '5s' * '2'; alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = '5s' + '2'; alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = (-'5') + (-'2'); alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = '5' * 1 + '2' * 1; alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = '5' * '1' + '2' * '1'; alert(a);`

Не запуская код, определите, что выведется на экран:

`let a = '' + 3 + 1; alert(a);`
←→
↑
en ru