Следующий код дает странные результаты:
console.log("" + 1 + 10 + 2 - 5 + "8");
Следующий код дает странные результаты:
console.log("" + 1 + 10 + 2 - 5 + "8");
"" + 1 === "1"
"1" + 10 === "110"
"110" + 2 === "1102"
"1102" - 5 === 1097
1097 + "8" === "10978"
В JavaScript оператор +
используется как для числового сложения, так и для конкатенации строк. Когда вы "добавляете" число в строку, интерпретатор преобразует ваш номер в строку и объединяет обе вместе.
Однако, когда вы используете оператор -
, строка преобразуется обратно в число, чтобы числовое вычитание могло произойти.
Когда вы затем добавляете строку "8"
, конкатенация строк происходит снова. Число 1097
преобразуется в строку "1097"
, а затем соединяется с "8"
.
строка + номер= конкатенированная строка
число + число= сумма обоих чисел
строка - число= разница между (принудительная строка) и числом
Если один или оба операнда являются строками, тогда плюс считается оператором конкатенации строк, а не добавлением чисел.
оператор минус всегда пытается преобразовать оба операнда в числа.
так:
"" + 1 + 10 + 2 = (string) "1102"
"1102" - 5 = (number) 1097
1097 + "8" = (string) "10798"
document.getElementById("1").innerHTML = "";
document.getElementById("2").innerHTML = "" + 1;
document.getElementById("3").innerHTML = "" + 1 + 10;
document.getElementById("4").innerHTML = "" + 1 + 10 + 2
document.getElementById("5").innerHTML = "" + 1 + 10 + 2 - 5
document.getElementById("6").innerHTML = "" + 1 + 10 + 2 - 5 + "8";
<ol>
<li id='1'></li>
<li id='2'></li>
<li id='3'></li>
<li id='4'></li>
<li id='5'></li>
<li id='6'></li>
</ol>
Этот сайт содержит полезную информацию.
JavaScript очень расслаблен относительно разницы между строками и числами.
...
Итак, если вы используете + для строки и числа, JavaScript будет делать номер строки для вас. Еще лучше, если вам это нужно, вы можете обрабатывать числа как строки или строки как числа.
И наоборот, если вы применяете математику к строке, JavaScript пытается сделайте это числом. Если строка не может быть интерпретирована как число (потому что в нем есть буквы), JavaScript дает NaN (Не номер).
Хотя +
и -
могут иметь одинаковые Приоритет операторов, они не имеют одинаковых неявных правил преобразования.
Поскольку -
всегда означает вычитание числа в JavaScript, использование -
всегда будет неявно пытаться анализировать как левую, так и правую часть выражения как целое.
В этом случае, поскольку приоритет оператора один и тот же, а оценка слева направо, вы получаете ( "+ 1 + 10 + 2), используя +
неявный tostring для конкатенации строк или строки" 1102 ". Затем -
будет неявно пытаться проанализировать строку" 1102 "на число, а также число 5, что приводит к 1102-5 или числу 1097. В этот момент строка" 8 "неявно конкатенируется используя +
, и можно увидеть конечный результат: строка" 10978".
Возможно, интересной альтернативой было бы "+ 1 + 10 + 2-5 + 8, которое было бы 1097 + 8 или число 1105.