首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在返回作为字符串参数传递的值时正确使用eval()的方法

在返回作为字符串参数传递的值时正确使用eval()的方法
EN

Stack Overflow用户
提问于 2015-12-31 11:41:41
回答 3查看 869关注 0票数 0

我将字符串参数传递给计算()函数。我需要把它们作为计算值归还。在下面的哪一种表单中,我正确地使用了eval()

数据:

代码语言:javascript
复制
var nums = ['2','3','1'], sum = ['+']; 

第一版:

代码语言:javascript
复制
function calculate(a,b,c,d,e)
{
        console.log('Calculating...(plus separators): '+a+' '+b+' '+c+' '+d+' '+e);
        console.log('Calculating...(comma separators): ',a,' ',b,' ',c,' ',d,' ',e);

        console.log('a :',a);
        console.log('b :',b);
        console.log('c :',c);
        console.log('d :',d);
        console.log('e :',e);
    return eval(a+b+c+d+e);
};
console.log('RESULT: ',calculate(nums[0],sum[0], nums[1],sum[0], nums[2]));

第二版:

代码语言:javascript
复制
function calculateP(a,c,e)
{
        console.log('Calculating...(plus separators): '+a+' '+c+' '+e);
        console.log('Calculating...(comma separators): ',a,' ',c,' ',e);

        console.log('a: ',a);
        console.log('c: ',c);
        console.log('e: ',e);
    return eval(a+c+e);
};
console.log('precise RESULT: ',calculateP(nums[0], nums[1], nums[2]));

Console显示“结果: 6"”精确结果: 231"

如果有的话,哪一个是正确的?在我看来,第一个("RESULT 6")是可以的,但我更愿意确定。

P.S I使用eval(),因为最初我将以字符串"2+3-(4*3)/7“的形式传递数学表达式,并希望对其进行计算。一种简单的计算器解析器

P.S #2我使用了数组,因为最终我将向这个函数传递更多的数组元素。

__________________________________________________________________________

编辑

它现在是否正确地使用了eval()

代码语言:javascript
复制
function plus(a,b) {
  return a+b;
}

function minus(a,b) {
  return a-b;
}

var expression = 'minus(plus(2, 3),minus(5,3))';

console.log('(2+3)-(5-3) ',eval(expression));

    expression = 'plus(plus(2, 3),minus(5,3))';

console.log('(2+3)+(5-3) ',eval(expression));
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-31 12:02:00

我真的相信你几乎在任何地方都可以避免eval,但是如果你做了一些不好的事情--做好事!

代码语言:javascript
复制
var expression = '2 + 3 - (4 * 3) / 7';

console.log(eval(expression));

数学运算?简单!

代码语言:javascript
复制
function cos(input) {
  return Math.cos(input);
}

function ln(input) {
  return Math.log(input);
}

var expression = '2 + 3 - cos(4 * 3) / ln(7)';

console.log(eval(expression));

你对伊娃所做的一切都是很奇怪的,而且违背了伊娃的本性。

票数 2
EN

Stack Overflow用户

发布于 2015-12-31 11:57:06

您好,您必须使用如下所示:

代码语言:javascript
复制
var nums = ['2','3','1'], sum = ['+']; 
function calculate(nums)
{
  var res =0;
  for(var i=0;i<nums.length;i++){
    res= res+(parseInt(nums[i]));
  }
    return res;
};

 console.log('RESULT: ',calculate(nums))
票数 1
EN

Stack Overflow用户

发布于 2015-12-31 13:31:01

仅举一个例子,说明如何处理没有eval()的字符串和一些值。

代码语言:javascript
复制
var operators = {
        '+': function (a, i) {
            a[i - 1] += a.splice(i, 2)[1];
            return true;
        },
        '*': function (a, i) {
            a[i - 1] *= a.splice(i, 2)[1];
            return true;
        },
        '(': function (a, i) {
            var j = i + 1,
                b;

            while (j < a.length) {
                if (a[j] === ')') {
                    b = a.splice(i + 1, j - i);
                    b.pop();
                    a[i] = calculate(b);
                    return true;
                }
                if (a[j] === '(') {
                    return false;
                }
                j++;
            }
        },
        ')': 0
    },
    precedence = ['(', '*', '+'];

function split(s) {
    var a = s.split(''),
        i = 1;

    while (i < a.length) {
        if (!(a[i - 1] in operators || a[i] in operators)) {
            a[i - 1] += a.splice(i, 1)[0];
            continue;
        }
        i++;
    }
    return a.map(function (b) {
        return b in operators ? b : Number(b);
    });
}

function calculate(a) {
    while (a.length > 1) {
        precedence.some(function (b) {
            return a.some(function (c, i) {
                if (b === c) {
                    return operators[b](a, i);
                }
            });
        });
    }
    return a[0];
}

document.write(calculate(split('12+23*37')) + '<br>'); // 863
document.write(calculate(split('12+23*(2+(3*4)+5)*37')) + '<br>'); // 16181

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34545982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档