Javascript-在包含数学运算的安全字符串上使用eval的问题

Javascript - Issue using eval on a safe string containing mathematics operations

本文关键字:问题 eval 字符串 安全 包含数 运算 Javascript-      更新时间:2023-09-26

我在使用eval执行此安全操作时遇到了一些问题。

var s = "(4.4 / 2.2) * 4567";
alert(eval(s)); // gives 9134
var t = "(4.4 / 2.2) * 04567";
alert(eval(t)); //gives 4846

有人能向我解释一下为什么变量t上4567后面的0导致答案为4846吗。

Javascript将以零开头的数字解释为八进制。因此,底座8中的04567等于底座10中的2423。

您可以尝试使用正则表达式来移除零,或者使用外部库来解析表达式。

这将是一种方式,例如:

var expression = "(4.4 / 2.2) * 04567".replace(/'d+/g, function(val){
     return parseInt(val, 10)
});
alert(eval(expression));

该代码将所有数字替换为基数为10的版本。请注意,该解决方案需要进行修改才能适用于小数或负数。

在Javascript中,前缀为0的数字被视为八进制。

以下是八进制数的示例:
01234,-077 0312
正八进制数必须以0(零)开头,后跟八进制数字
负八进制数必须以-0开头,后跟八进制数字。

使用可以克服

var t = "(4.4 / 2.2) * Number(04567)";