Калькулятор JavaScript — мой шестой проект для спидрана. На первый взгляд я подумал: «Это всего лишь калькулятор, я должен быстро его закончить». Однако проект оказался на удивление непростым в реализации. Тем не менее, честно говоря, пока это тот, над которым мне было веселее всего работать.
Самая большая проблема с этим заключалась в том, чтобы выяснить, как выполнять множественные вычисления, а также выполнять мультипликативные вычисления перед обработкой аддитивных. Как я справился с этим, я определил массив для всех вычислений, и как только пользователь нажимает кнопку равенства (или нажимает Enter), массив повторяется один раз для обработки всех мультипликативных вычислений, уменьшая массив до аддитивных вычислений, а затем массив повторяется еще раз для обработки их по очереди.
Например, предположим, что пользователь вводит 1+2*2/4, тогда массив будет выглядеть так: ["1", "+", "2", "*", "2", "/", "4"]
. На первой итерации массив сокращается до следующего: ["1", "+", "1"]
. На второй итерации оценивается 1+1 и возвращается результат 2.
Другие проблемы заключались в предотвращении добавления нескольких последовательных операций в массив (например, ["1", "+", "*", "2"]
), а также в предотвращении использования нескольких десятичных точек в десятичных числах. Кроме того, обработка десятичных знаков также была проблемой, и именно по этой причине числа хранятся в массиве в виде строк, а не обычных чисел. Причина этого в том, что JavaScript не позволяет ставить нули после запятой, но что, если пользователь хочет ввести, например, 1,005? Тогда они не смогут этого сделать, потому что нули будут игнорироваться, поэтому я решил, что лучшим решением будет просто сохранить их как строковые значения, а затем преобразовать их в числа, когда придет время выполнять вычисления.
Я знаю, что проект, вероятно, можно было бы сделать лучше и эффективнее, но я изо всех сил старался сделать это как можно лучше с моим нынешним набором навыков. Кроме того, в качестве примечания, учитывая, что это скоростное прохождение, я не тратил много времени на то, чтобы сделать его более похожим на настоящий калькулятор, но я определенно планирую сделать это, когда буду создавать проект, не являющийся частью скоростного прогона.
Ссылки:
- Живая версия калькулятора JavaScript
- "Исходный код"