我正在写一些语法分析器,不允许更改原语。
因此,我知道可以通过以下方式修改原语:
let p // a primitive
p = 1
p += 1
p -= 1
p %= 1
p *= 1
它真的是完整,详尽的方法清单吗?还是我忘记了什么...
附言该分析仪用于我特有的库。它不允许将传递的参数更改为返回测试闭包的对象文字的函数,即每个闭包都不得更改其公共原语。
最佳答案
干得好:
// assignment operators
p = 1;
p += 1;
p -= 1;
p *= 1;
p /= 1;
p %= 1;
p <<= 1;
p >>= 1;
p >>>= 1;
p &= 1;
p ^= 1;
p |= 1;
p **= 1;
// decrement / increment operators
p++;
++p;
p--;
--p;
// destructuring
({ p } = { p: 1 });
({ a: p } = { a: 1 });
([p] = [1]);
请注意,以上所有内容也可能出现在解析的字符串中:
(new Function("p = 1"))();
eval("p = 1");
该分析仪用于我特有的库。它不允许更改传递的参数。
然后,我想最简单的方法就是解析:
function toTest(p) { /* body */ }
并执行它:
const p = 1;
try {
eval(/* body */);
} catch(e) {
//...
}
如果发生错误,则有人试图使const突变。