Javascript 此表达式是否有eval()替代选项?

Javascript 此表达式是否有eval()替代选项?,javascript,eval,Javascript,Eval,我有这样一个字符串表达式:“1+2+3”,它必须保持为字符串。换句话说,循环和强制转换数字以执行操作不是一个选项,因此我的解决方案是eval(“1+2+3”)。但是eval()速度很慢,并且与所有这些问题相关。有没有其他方法来评估我的字符串?评估字符串不仅速度慢,而且危险。如果由于恶意用户意图或错误,您最终评估的代码导致程序崩溃、数据破坏或打开安全漏洞,该怎么办 不,您不应该eval()字符串。您应该拆分它,将操作数转换为数字,然后求和 如果愿意,您可以保留字符串(您说过需要该字符串),但使用字

我有这样一个字符串表达式:
“1+2+3”
,它必须保持为字符串。换句话说,循环和强制转换数字以执行操作不是一个选项,因此我的解决方案是
eval(“1+2+3”)
。但是
eval()
速度很慢,并且与所有这些问题相关。有没有其他方法来评估我的字符串?

评估字符串不仅速度慢,而且危险。如果由于恶意用户意图或错误,您最终评估的代码导致程序崩溃、数据破坏或打开安全漏洞,该怎么办

不,您不应该
eval()
字符串。您应该拆分它,将操作数转换为数字,然后求和

如果愿意,您可以保留
字符串
(您说过需要该字符串),但使用
字符串
实际执行此操作是一个非常糟糕的主意

var string = "1+2+3"
var numbers = string.split('+').map(function(x) { return parseInt(x) })
var sum = numbers.reduce(function(total, x) { return total + x }, 0)

计算字符串不仅速度慢,而且危险。如果由于恶意用户意图或错误,您最终评估的代码导致程序崩溃、数据破坏或打开安全漏洞,该怎么办

不,您不应该
eval()
字符串。您应该拆分它,将操作数转换为数字,然后求和

如果愿意,您可以保留
字符串
(您说过需要该字符串),但使用
字符串
实际执行此操作是一个非常糟糕的主意

var string = "1+2+3"
var numbers = string.split('+').map(function(x) { return parseInt(x) })
var sum = numbers.reduce(function(total, x) { return total + x }, 0)

这是一个愚蠢的问题:

var reducer = function (a, b) { 
    return +a + +b; 
};

"1+2+3".match(/[+-]?\d+/g).reduce(reducer); // 6

// or addition only
"1+2+3".split(/\D/).reduce(reducer); // 6

这是一个愚蠢的问题:

var reducer = function (a, b) { 
    return +a + +b; 
};

"1+2+3".match(/[+-]?\d+/g).reduce(reducer); // 6

// or addition only
"1+2+3".split(/\D/).reduce(reducer); // 6

例如,可以通过获取“1”、“2”和“3”作为输入来建立该表达式吗?如果您感到勇敢,您可以编写自己的解析器,或者在上面找到适合您的解析器<代码>评估不慢。这只是个麻烦。如果你不能循环并将字符串的一部分转换为数字,那么就没有其他选项了,但eval在这里就是这么做的,它会计算字符串中的表达式。任何简单的东西都会变得太脆弱而无法使用(例如,请参阅下面无法处理
-1
1.1
的答案),否则它将过于复杂,难以轻松实现(AST等)。如果可以,可以使用
eval
。@tadman你能解释一下会引起什么麻烦吗?这个表达式可以通过获取例如“1”、“2”和“3”作为输入来建立吗?如果你觉得勇敢,你可以编写自己的解析器,或者在上面找到适合你的东西<代码>评估不慢。这只是个麻烦。如果你不能循环并将字符串的一部分转换为数字,那么就没有其他选项了,但eval在这里就是这么做的,它会计算字符串中的表达式。任何简单的东西都会变得太脆弱而无法使用(例如,请参阅下面无法处理
-1
1.1
的答案),否则它将过于复杂,难以轻松实现(AST等)。如果可以,请使用
eval
。@tadman您能解释一下会引起什么问题吗?OP:“铸造数字来执行操作不是一个选项”,而是
eval
所做的。如果你要调用一个函数来做这件事,有什么区别吗?OP:“铸造数字来执行操作不是一个选项”,它是
eval
所做的。如果你要调用一个函数来做这件事,有什么区别?