代碼修改自我在 javascript中運算符優先級的問題 中的回答javascript
完整的 JS 引擎還須要處理運算符優先級的問題,這裏簡化複雜度,人工把表達式轉換成後綴表達式再用程序進行自動求值java
主要目的在於演示 JS 引擎表達式求值的過程當中求值的前後順序,以及 Short-circuit evaluationsegmentfault
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:post
console.log(postfixEval({ var1: false, var2: true, var3: true, }, 'var1 var2 var3 && ||')); // var1 || var2 && var3
結果 1:ui
var1 var2 var3 true
執行 2:this
console.log(postfixEval({ var1: false, var2: false, var3: true, }, 'var1 var2 var3 && ||')); // var1 || var2 && var3
結果 2:lua
var1 var2 false
執行 3:code
console.log(postfixEval({ var1: true, var2: true, var3: true, }, 'var1 var2 var3 && ||')); // var1 || var2 && var3
結果 3:ip
var1 true