请建议一个eval((的替代方案,因为它显然是;"不安全";。请解释原因。我把这个代码用于我的计算器应用程序,它很有效,但我想优化它。
if (e.target.innerHTML === "=" ){
newArr=arr.join(' ');
var result =eval(newArr);
pnode.innerHTML = result;
}
else
{
pnode.innerHTML = e.target.innerHTML;
arr.push(e.target.innerHTML);
console.log(arr);
}
实现这一点的最"正确"的方法(不易受到while(1) {}
之类的影响(是使用表达式计算器库,如MathJS
eval
通常被认为是不安全的,因为它将以调用方的全部权限在客户端设备上运行任何作为输入的代码,无论该代码是否恶意
如果运行的字符串eval
可能受到恶意第三方的影响,则这是危险的,因为它将拥有用户授予网页的所有权限
例如,邪恶的用户X可能编写了一个脚本,您的应用程序无辜地将其提供给用户Y的浏览器,并在浏览器中使用eval
运行
但是,在您的情况下,由于您没有将数据从一个用户提供给另一个用户,因此字符串不可能受到第三方的影响,因此使用eval
是完全可以的。请参阅此问题。然而,与替代Function
相比,eval的效率相对较低。函数虽然仍然不安全,但更安全,但我们已经确定这种类型的漏洞不适用于您的用例。更重要的是(至少根据MDN文档(,Function
更有效。只需执行:var result = Function("return" + newArr)();
您的客户端仍然可以编写像while(true){console.log("infinite loop")}
这样愚蠢的东西,但他们无论如何都可以通过控制台来完成,这不会影响其他人。总之,eval
和类似的功能经常被盲目地谴责为";"不安全";,但只有在某些情况下才是这样。
我们可以使用对象而不是使用eval()
方法。将数据存储为属性中的value
,key
是对象的标识符。
示例:
let obj = {a: 9, b: 10};
console.log(obj.a + obj.b);
OR,
如果您需要eval()
的替换器,请参阅以下使用字符串计算9
和10
之和的代码段:
console.log(Function('return ' + '9 + 10')()) // 19
函数可能会有所帮助
const fun = new Function('a', 'b', 'return a + b')
console.log(fun(1, 2)) // output: 3