我正在写一些语法分析器,不允许更改原语。

因此,我知道可以通过以下方式修改原语:

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突变。

10-06 04:51