Создание калькулятора JavaScript с нуля?

Я пытаюсь создать калькулятор JavaScript с нуля, не следуя руководству, в качестве учебного упражнения. Большая часть функций работает, за исключением случаев, когда вычисления выполняются сразу после других. то есть: 7 х 6 + 42 В этом случае он сбрасывает отображение на 0, но, похоже, все равно сохраняет переменную.

Нужно ли хранить числа в 3 значениях вместо 2? В настоящее время я использую: -текущая стоимость, который содержит предыдущую сумму расчета. -newValue - номер, который пользователь вводит в данный момент.

function newNum(pressed) { //Adds digit of key pressed to new number being entered.
  //console.info ("Button pressed " + pressed);

  if (newValue == 0) { //If new calculation, newValue is set to key pressed.
    newValue += pressed;
  } else { //Else if continuing calculation, key pressed is added to end of newValue.
    newValue = newValue.toString();
    newValue = newValue + pressed; //Adds digit at end of String, then converts back to Number.
    newValue = parseFloat(newValue);
  }
  document.getElementById('result').innerHTML = newValue;
}

function newCalc(pressed) { //Will use this mathematical operation to find the value.
  if (!currentValue) {
    currentValue = newValue;
  } else {
    document.getElementById('result').innerHTML = newValue;
  }

  newOperation = pressed;
  newValue = 0;
}

function equals() { //Resolves calculation.
  newValue = parseFloat(newValue);

  switch(newOperation) {
    case "/":
        currentValue = (currentValue / newValue);
        break;
    case "*":
        currentValue = (currentValue * newValue);
        break;
    case "-":
        currentValue = (currentValue - newValue);
        break;
    case "+":
        currentValue = (currentValue + newValue);
        break;
  }

  currentValue = parseFloat(currentValue);
  newValue = 0;
  document.getElementById('result').innerHTML = currentValue;
}

https://codepen.io/adam_weiler/pen/aRNppX

Я все еще учусь и знаю, что код немного раздут. Любые предложения по его оптимизации тоже будут полезны!

Обновлено: Я привел плохой пример. Я просто кодирую простой калькулятор, где вы нажимаете кнопки для ввода чисел. Он не использует BEDMAS; порядок операций - это «порядок, в котором их вводит пользователь». Так что да, просто простой калькулятор постукивания.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
219
2

Ответы 2

В вашем примере код пытается вычислить 7 * 6 и 6 + 42 одновременно, но нет 6, которое можно было бы добавить к 42, потому что оно было умножено на 7, поэтому его нельзя вычислить с помощью . Вы должны установить правила для предпочтения операции, когда происходит умножение или деление, округляющие числа должны быть рассчитаны как новое число, а затем вы можете продолжить работу с вашим сложением или вычитанием. Кроме того, вы должны определить правило слева направо, поэтому, если у вас есть 2 * 3/4, ошибка больше не возникнет.

Разбор выражений! Как весело! Я делал это пару раз, но новичку не рекомендовал бы ...

Vilx- 06.10.2018 00:03

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

Patrik Alexits 06.10.2018 00:07

Я думаю, он пытается создать «классический» калькулятор. Например, когда вы нажимаете операцию или =, предыдущая операция разрешается, и вы больше не можете вернуться. Таким образом, нажатие 2+2x2 действительно даст 8.

Vilx- 06.10.2018 00:09

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

Patrik Alexits 06.10.2018 00:17

Если вы введете

 7 | x | 8 | = | + | 5 | = |

работает без проблем. Я предполагаю, что вы хотите запускать equals() всякий раз, когда нажимается кнопка операции, а не только на = ...

Is it necessary to store the numbers in 3 values, instead of 2?

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

 7
 7 x
 7 x 8
 7 x 8 +
 46 + // merged
 46 + 5
 46 + 5 =
 51 // merged

Если я выполняю функцию equals () каждый раз, когда нажимаю кнопку вычисления (+ - * /), то она сбрасывает newValue на 0. Я думаю, мне придется изменить функцию equals (), чтобы понять, что она должна запускаться в первый раз. без сброса, тогда он может вычислить / сбросить следующие времена.

Adam Weiler 06.10.2018 00:50

Другие вопросы по теме