new Calculator({actions: '2 + 2 * 2'})не понятно, зачем указывать объект {actions: '2 + 2 * 2'}который содержит строку, которая должна быть разбита пробелами, чтобы потом разбирать эту строку по пробелам, вместо того, чтобы просто указать {new Calculator([2, '+', 2, '*', 2]) throw new Error("Должно быть число или операция, а не: "+val);на английском static getOperations() { return { '+': {priority: 1,func: (a, => a + b}, '-': {priority: 2,func: (a, => a - b}, '*': {priority: 3,func: (a, => a * b}, '/': {priority: 4,func: (a, => a / b} }; }каждый раз создаешь и возвращаешь объект. Зачем? static checkOperation(val) { return Calculator.getOperations()[val] !== undefined; }не так проверяется наличие/отсутствие в объекте ключадолжно проверяться либо hasOwnProperty либо key in object (в зависимости от ситуации) из-за того, что используешь parseFloat, твой калькулятор позволяет писать '2_ololo + 1' // 3мне кажется это не то поведение, которое ожидается от калькуляторапохоже на хард код if(isOperation && Calculator.checkOperation(actions[actions.length-1])) { // Если последнее и новое действие это операция то заменяем старое новым actions[actions.length-1] = val; } else if (!isOperation || (isOperation && actions.length > 0)) { if(!isOperation && Calculator.checkNumber(actions[actions.length-1])) { actions.push('+'); // (!) ТУТ } actions.push(val); } }Сделай еще проще:1. на входе проверяешь регулярками 2. чтобы получить результат, делаешь так var fn = new Function('return 2 + 2 * 2;');console.log(fn());