我正在尝试实现原始类型的波兰表示法计算器,我正在使用一个对象来定义每个操作。
这样调用
new RPNCalculator().calculate([4, 5, '+']);
将产生9或
的答案new RPNCalculator().calculate([4, 5, '+', 3, 5, '+', '*']);
将产生72的答案。
代码在这里:
function RPNCalculator(arr) {
this.calculate = function(arr) {
var resultArr =[];
for(var i=0; i < arr.length; i++) {
if(typeof(arr[i]) == 'number') {
resultArr.push(arr[i]);
}
else {
var a = resultArr.pop();
var b = resultArr.pop();
var c = opers[arr[i]].apply(this, [a, b]);
resultArr.push(c);
}
}
return resultArr.pop();
}
var opers = {
"+": function(a, b) { return a + b; },
"-": function(a, b) { return a - b; },
"*": function(a, b) { return a * b; },
"/": function(a, b) { return a / b; }
}
}
计算工作正常,但我想知道的是下一行
var c = opers[arr[i]].apply(this, [a, b]);
是根据数组中当前索引处的符号调用opers
对象中包含的必需函数的最佳方法,还是有更好的方法来执行此操作?
答案 0 :(得分:3)
您的代码中并不需要引用this
,因为这些函数不适用于任何类成员。
在这种情况下,您只需执行以下操作:
var c = opers[arr[i]](a, b);
哪个更清洁一点。但是,为了最具可读性,我建议:
var operator = opers[arr[i]];
var c = operator(a, b);