Добавление и вычитание строк и чисел в Javascript - автоматическое преобразование типов? - PullRequest
5 голосов
/ 14 ноября 2011

Давайте посмотрим на следующий код Javascript.

<script type="text/javascript" lang="javascript">
    function test()
    {
        alert('2'+8);
        alert(8-'2');
    }
</script>

В первом окне оповещения отображается результат объединения 2 и 8, равный 28 . Однако во втором окне оповещения отображается вычитание двух чисел, равное 6 . Как?

Ответы [ 5 ]

10 голосов
/ 14 ноября 2011

Оператор + перегружен.Если какой-либо операнд является строкой, выполняется конкатенация строк.Если у вас есть два номера, добавление выполняется.- не перегружается таким образом, и все операнды преобразуются в числа.

Из спецификации:

11.6.1 Оператор сложения(+)

(...)
7. Если тип ( lprim ) равен строке или тип ( rprim ) равенString, затем

  • Возвращает строку, которая является результатом объединения ToString ( lprim ), за которым следует ToString ( rprim )

8.Возврат результата применения операции сложения к ToNumber ( lprim ) и ToNumber ( rprim ).
(...)

11.6.2 Оператор вычитания (-)

(...)
5. Пусть lnum будет ToNumber ( lval ).
6. Пусть rnum будет ToNumber ( rval ).
7. Вернуть результат применения операции вычитания к lnum и rnum .
(...)

4 голосов
/ 14 ноября 2011

+ используется как для объединения, так и для сложения, но при использовании со строкой по умолчанию используется сцепление. - нельзя использовать со строками, поэтому его операнды преобразуются в числа.

Редактировать: Это не означает, что он идентичен приведенному выше посту! XD

3 голосов
/ 14 ноября 2011

+ используется как для объединения строк, так и для сложения.Если любой из оперантов является строкой, используется конкатенация.- используется только для вычитания, оба оператора всегда приводятся к числам.

1 голос
/ 14 ноября 2011

1-й: он переводит 2-й операнд в 1-й операнд (String), потому что + используется и для конкатата строк.

2-й: он переводит 2-й операнд в число, потому что - просто используется для операций с числами.

0 голосов
/ 09 мая 2014

Если вы не хотите этого, легко исправить это: (1 * '2') + 8 JSYK

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...