代码修正自我在 javascript中运算符优先级的题目 中的回复
完全的 JS 引擎还需要处置惩罚运算符优先级的题目,这里简化复杂度,人工把表达式转换成后缀表达式再用顺序举行自动求值
重要目标在于演示 JS 引擎表达式求值的过程当中求值的先后顺序,以及 Short-circuit evaluation
function postfixEval(vars, expr) {
class Expr {
eval() {}
}
class Var extends Expr {
constructor(v) {
super();
this.v = v;
}
eval() {
console.log(this.v);
return vars[this.v];
}
}
class BinOp extends Expr {
constructor(type, a, b) {
super();
this.type = type;
this.a = a;
this.b = b;
}
eval() {
switch (this.type) {
case '&&':
if (this.a.eval()) {
return this.b.eval();
}
return false;
break;
case '||':
var val;
if (val = this.a.eval()) {
return val;
}
if (val = this.b.eval()) {
return val;
}
return false;
break;
}
}
}
var queue = expr.split(' ');
var stack = [];
while (queue.length) {
var o = queue.shift();
switch (o) {
case '&&':
case '||':
var b = stack.pop();
var a = stack.pop();
stack.push(new BinOp(o, a, b));
break;
default:
stack.push(new Var(o));
}
}
return stack[0].eval();
}
实行 1:
console.log(postfixEval({
var1: false,
var2: true,
var3: true,
}, 'var1 var2 var3 && ||')); // var1 || var2 && var3
效果 1:
var1
var2
var3
true
实行 2:
console.log(postfixEval({
var1: false,
var2: false,
var3: true,
}, 'var1 var2 var3 && ||')); // var1 || var2 && var3
效果 2:
var1
var2
false
实行 3:
console.log(postfixEval({
var1: true,
var2: true,
var3: true,
}, 'var1 var2 var3 && ||')); // var1 || var2 && var3
效果 3:
var1
true