Калькулятор JavaScript — мой шестой проект для спидрана. На первый взгляд я подумал: «Это всего лишь калькулятор, я должен быстро его закончить». Однако проект оказался на удивление непростым в реализации. Тем не менее, честно говоря, пока это тот, над которым мне было веселее всего работать.

Самая большая проблема с этим заключалась в том, чтобы выяснить, как выполнять множественные вычисления, а также выполнять мультипликативные вычисления перед обработкой аддитивных. Как я справился с этим, я определил массив для всех вычислений, и как только пользователь нажимает кнопку равенства (или нажимает Enter), массив повторяется один раз для обработки всех мультипликативных вычислений, уменьшая массив до аддитивных вычислений, а затем массив повторяется еще раз для обработки их по очереди.

Например, предположим, что пользователь вводит 1+2*2/4, тогда массив будет выглядеть так: ["1", "+", "2", "*", "2", "/", "4"]. На первой итерации массив сокращается до следующего: ["1", "+", "1"]. На второй итерации оценивается 1+1 и возвращается результат 2.

Другие проблемы заключались в предотвращении добавления нескольких последовательных операций в массив (например, ["1", "+", "*", "2"]), а также в предотвращении использования нескольких десятичных точек в десятичных числах. Кроме того, обработка десятичных знаков также была проблемой, и именно по этой причине числа хранятся в массиве в виде строк, а не обычных чисел. Причина этого в том, что JavaScript не позволяет ставить нули после запятой, но что, если пользователь хочет ввести, например, 1,005? Тогда они не смогут этого сделать, потому что нули будут игнорироваться, поэтому я решил, что лучшим решением будет просто сохранить их как строковые значения, а затем преобразовать их в числа, когда придет время выполнять вычисления.

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

Ссылки:

Предыдущие проекты: