Добавление и вычитание строк и чисел в Javascript — автоматическое преобразование типов?

#javascript #type-conversion

#javascript #преобразование типов

Вопрос:

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

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

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

Комментарии:

1. quirksmode.org/js/strings.html , посмотрите пример для ‘concat’.

Ответ №1:

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

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

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

(…)
7. Если Type (lprim) — строка или Type (rprim) — строка, то

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

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

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

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

Ответ №2:

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

Ответ №3:

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

Редактировать: это не должно быть идентично приведенному выше сообщению! XD

Ответ №4:

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

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

Ответ №5:

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