代码修改自我在 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。