Есть целая куча причин, почему это неправильный подход.
Во-первых, innerHTML
возвращает строку, содержащую не только текстовое содержимое элемента, но и любые вложенные элементы HTML. Если это именно тот текст, который вы хотите, используйте textContent
.
Далее, путем ввода пользователем фактического оператора математики, который они хотят использовать в одной строке с номерами, создается больше путаницы. Попросите пользователя ввести его отдельно, а затем вы можете использовать логику if/then
, чтобы в конечном счете использовать правильный оператор.
Далее (и это важная часть), никогда не используйте eval()
. Не обязательно решать какие-либо проблемы, с которыми вы могли столкнуться, но это открывает дверь для атак типа «Cross Site Scripting» на ваш сайт. Кроме того, он управляет привязкой this
и выполняет свой код в своей области.
Что вам действительно нужно сделать, это просто преобразовать ввод строки в число, чтобы вы могли с ней справиться. Вы можете сделать это с parseInt()
и parseFloat()
Итак, ваша линия может быть:
math.innerHTML += " = " + parseFloat(math.textContent);
Наконец, по математике, порядок операций:
- Скобки
- Показатели:
- Мультипликация п
- Отдел
- Addtion
- Вычитание
Вы можете видеть, что деление сделано до того, и это означает, что в вашем выражении: 11 + 11/2
, первый 11/2
оценивается (5.5), а затем это добавлено к 11
(16,5).
Наконец, помните, что оператор +
в JavaScript может означать математическое сложение или конкатенацию строк, и если один из операндов является строкой, другой будет преобразован в строку.
Зачем «11 + 11/2' быть' 11'? '11/2' -' 5.5', а '11 + 5.5' -' 16.5'. – Pointy
Попробуйте '(11 + 11)/2' и вспомните, когда узнали о приоритете оператора. – Pointy
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что речь идет о PEDMAS, а не о программировании – Paulpro