Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将字符串解析为值-计算_Javascript_Jquery - Fatal编程技术网

Javascript 将字符串解析为值-计算

Javascript 将字符串解析为值-计算,javascript,jquery,Javascript,Jquery,我有这样一个字符串: var data ="(1+2*(3+2))"; var data ="(1+2*(3+2))"; var res = math.eval(data); 我试图解析字符串,以获得适当的结果。但我还是没有得到任何解决方案,任何想法 预期结果=11尝试 var result = eval(data); 虽然eval可能是邪恶的,但情况并非总是如此只要您100%确信输入是绝对安全的,您就可以直接使用eval: var data ="(1+2*(3+2))"; var res

我有这样一个字符串:

var data ="(1+2*(3+2))";
var data ="(1+2*(3+2))";
var res = math.eval(data);
我试图解析字符串,以获得适当的结果。但我还是没有得到任何解决方案,任何想法

预期结果=
11

尝试

var result = eval(data);

虽然eval可能是邪恶的,但情况并非总是如此

只要您100%确信输入是绝对安全的,您就可以直接使用eval:

var data ="(1+2*(3+2))";
var res = eval(data);

但是,如果您不信任输入,您可以考虑寻找不同的解决方案(仍然使用eval),如用户Kennebec在此处提出的:

或者更好,您可以考虑使用第三方库,如mathjs:

您不应该使用eval的原因其实有很多,但只要您确信您可以控制输入流,并且只要您绝对确信用户不能将eval用于任何邪恶范围,您就可以安全地使用eval

无论如何,因为mathjs的存在,如果你需要进一步的计算,我个人推荐你mathjs

对于mathjs,代码如下所示:

var data ="(1+2*(3+2))";
var data ="(1+2*(3+2))";
var res = math.eval(data);
小提琴:

另外,作为补充说明,要使用mathjs库,您只需包含一个脚本,它可以作为cdn提供:

编辑:

如果你不是DL;博士读者,请随意阅读以下内容:

如果您对常规的
eval()
mathjs的
eval
之间的区别感到好奇,下面是直接取自源代码的代码片段:

/**
       * Parse and evaluate the given expression
       * @param {String} expr   A string containing an expression, for example "2+3"
       * @return {*} result     The result, or undefined when the expression was empty
       * @throws {Error}
       */
      Parser.prototype.eval = function (expr) {
        // TODO: validate arguments
        return _parse(expr)
            .compile(math)
            .eval(this.scope);
      };
和_parse:

/**
       * Parse an expression. Returns a node tree, which can be evaluated by
       * invoking node.eval();
       *
       * Syntax:
       *
       *     parse(expr)
       *     parse(expr, options)
       *     parse([expr1, expr2, expr3, ...])
       *     parse([expr1, expr2, expr3, ...], options)
       *
       * Example:
       *
       *     var node = parse('sqrt(3^2 + 4^2)');
       *     node.compile(math).eval(); // 5
       *
       *     var scope = {a:3, b:4}
       *     var node = parse('a * b'); // 12
       *     var code = node.compile(math);
       *     code.eval(scope); // 12
       *     scope.a = 5;
       *     code.eval(scope); // 20
       *
       *     var nodes = math.parse(['a = 3', 'b = 4', 'a * b']);
       *     nodes[2].compile(math).eval(); // 12
       *
       * @param {String | String[] | Matrix} expr          Expression to be parsed
       * @param {{nodes: Object<String, Node>}} [options]  Available options:
       *                                                   - `nodes` a set of custom nodes
       * @return {Node | Node[]} node
       * @throws {Error}
       */
      math.parse = function parse (expr, options) {
        return _parse.apply(_parse, arguments);
      }

    };
/**
*解析表达式。返回一个节点树,可以通过
*调用node.eval();
*
*语法:
*
*解析(expr)
*解析(expr,选项)
*解析([expr1,expr2,expr3,…)
*解析([expr1,expr2,expr3,…],选项)
*
*例如:
*
*var node=parse('sqrt(3^2+4^2)');
*node.compile(math.eval();//5.
*
*变量范围={a:3,b:4}
*var node=parse('a*b');//12
*var code=node.compile(数学);
*代码。评估(范围);//12
*范围a=5;
*代码。评估(范围);//20
*
*var节点=math.parse(['a=3','b=4','a*b']);
*节点[2]。编译(数学)。eval();//12
*
*要分析的@param{String | String[]| Matrix}expr表达式
*@param{{nodes:Object}[options]可用选项:
*-`nodes`一组自定义节点
*@return{Node | Node[]}Node
*@throws{Error}
*/
math.parse=函数解析(expr,选项){
返回_parse.apply(_parse,arguments);
}
};

同意,评估适用于此处