любая реализация имеет право на жизнь, даже нерабочая =)== мелочи == в нескольких местах if(Object.prototype.toString.call( arr ) !== '[object Array]') {вместо Array.isArrayв чем смысл? this.actions = this.actions.concat(val);== главное ==могу ошибаться, но при данных let obj = new Calculator([2, '+', '*', 2.15]);твой калькулятор тихо умираетвалидация не отрабатывает, ошибка не перехватывается мне кажется тебе надо еще больше упростить провеку: не пытайся валидировать весь массив, валидурий входящие данные поэлементно думаю, проверку надо делать на этапе добавления данных, а не запуске (просчете) калькулятора --- примерно так (обработка ошибок по вкусу) 'use strict';const PRIVATE = Symbol();class Calculator { constructor(...items) { this[PRIVATE] = []; this.add(...items); } clear() { this[PRIVATE].length = 0; } add(...items) { let valideted = items.filter(item => Calculator.isValid(item)); this[PRIVATE].push(...valideted); } calculate() { let string = this[PRIVATE].join(''); let fn; try { fn = new Function(`return ${string} + 0;`); } catch (e) { console.log(1); throw e; } return Number(fn()); } static isValid(item) { return /^(?:[-+*/%]|\d+|\d+.\d+)$/.test(item); }}let obj = new Calculator(2, '/', 4);console.log(obj);console.log(obj.calculate());http://codepen.io/anon/pen/PZBowj?editors=1011