繁体   English   中英

字符串=> JS中的数字转换

[英]string => number conversion in JS

我有一个URL,我在哈希之后进行解析。 哈希之后的内容是一个数学方程式(例如http://example.com/something#5+1 ),我想找到它的和(或任何其他方程式的结果,例如乘积,除法等) )

我可以使用以下方法检索数字:

var url = (window.location.hash).substr(1) // returns "5+1" as a string

虽然我发现如果尝试将其转换为数字,但实际上并没有进行数学运算。 它将其缩减为5,而不是显示8之和。

这种转换可能吗?

谢谢!

不要从URL中eval()任意代码,因为它很容易被XSS利用。 我创建了一个名为JSandbox的库,该库可以对JavaScript代码执行进行沙箱处理,但是它需要Web工作者的支持。 对IE使用伪造的工人支持不是一个好主意,因为沙盒的安全性已荡然无存。

您的代码将如下所示:

JSandbox.eval("with(Math){" + location.hash.substr(1) + "}", function (res) {
  // handle the results here
});

使用它还可以处理错误:

JSandbox.eval("with(Math){" + location.hash.substr(1) + "}", function (res) {
  // handle the results here
}, null, function (err) {
  // handle errors here
});

我包括了一个with (Math) { ... }包装器,因此哈希码可以短时间访问Math函数。 (例如abs(..)而不是Math.abs(..)

eval()是执行计算的最简单方法,但是您肯定要验证输入是否正确:

var input = window.location.hash.substr(1);
var result = null;

try {
  // Make sure the input is only numbers and supported operators.
  if (/^[-+*/.()0-9]+$/.test(input))
    result = eval(input);
} catch (ex) {
  // Insert error handling here...
}

此正则表达式应过滤掉任何危险的输入。

为了真正正确地做到这一点,您需要为您的数学表达式语言编写一个简单的解析器。 据称这不是很困难,但我本人却从未能够做到。 这是使javascript正确评估和正确解释数学表达式的唯一方法,而无需同时打开pandoras框,并让所有讨厌的东西像对eval()的简单(愚蠢)调用一样通过。

或者,您可以四处看看,找到已经做到这一点的人,例如:

http://silentmatt.com/math/evaluator.php

要执行字符串,请参见eval ,某些不执行此操作的原因why-is-using-javascript-eval-function-a-bad-idea处

这意味着在任何重要的代码中-来自不可信来源(例如Internet)的数据-您都应该解析出数字和数学运算...而不能接受任何其他类型的输入。

var code = "5+1";
var result = window.eval(code);

但是,就像所有具有评估功能的语言一样,请谨慎评估。

function CalculateString(hash) {
    var ReturnValue;

    var patt = '([\d*+-/.%])';
    ReturnValue = hash.match(patt)[1];
    ReturnValue = eval(ReturnValue);

    if (ReturnValue > 0) {
        return parseInt(ReturnValue,10);
    } else {
        return 0;
    }
}

所以你可以这样:

var Hash = (window.location.hash).substr(1);
var Calculation = CalculateString(Hash); // Retinerer result of the calculation if it is valid, otherwise it will give you 0.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM