#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:
Оператор перегружен. Если какой-либо операнд является строкой, выполняется конкатенация строк. Если у вас есть два числа, выполняется сложение. -
Таким образом не перегружается, и все операнды преобразуются в числа.
Из спецификации:
(…)
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