如何强制JS进行数学运算而不是将两个字符串放在一起


102

我需要用javascript将5加到一个整数变量中,但是它将变量视为一个字符串,所以它写出了该变量,然后将5加到“字符串”的末尾。我该如何强迫它进行数学运算呢?

var dots = document.getElementById("txt").value; // 5
function increase(){
    dots = dots + 5;
}

输出: 55

如何强制输出10


3
该特定示例中,输出10
deceze


10
您给希望通过转储所有代码而不进行任何尝试的人提供帮助的人承受了不适当的负担。自己进行测试... CSS属性#control对您的问题有帮助吗?如果不是,请删除它们,不要向我们显示。继续减少代码,直到您拥有重现问题所需的绝对最低限度的测试用例为止。大多数时候,这样做会导致发现问题在此过程中学习。如果您自己不能解决问题,那么您很可能会通过简单的示例获得快速帮助。
Phrogz'1

Answers:


108

你有线

dots = document.getElementById("txt").value;

在您的文件中,这会将点设置为字符串,因为txt的内容不限于数字。

将其转换为int,将行更改为:

dots = parseInt(document.getElementById("txt").value, 10);

注意:10此处指定小数点(以10为底)。否则,某些浏览器可能无法正确解释该字符串。参见MDN :parseInt


3
快捷方式...点= + document.getElementById(“ txt”)。value
Tracker1 2011年

5
parseInt(...,10)还要始终使用基数...进行健全性检查...如果(!dots ||点<1)可能也井井有条...
Tracker1 2011年

1
最好对增量使用增量运算符。像VARIABLE ++而不是VAR = VAR + 1;
gnganpath 2014年

53

最简单的:

dots = dots*1+5;

点将转换为数字。


34
比这还要简单dots = +dots+5
安迪E


9

我要添加此答案,因为在这里看不到它。

一种方法是在值前放置一个“ +”字符

例:

var x = +'11.5' + +'3.5'

x === 15

我发现这是最简单的方法

在这种情况下,该行:

dots = document.getElementById("txt").value;

可以更改为

dots = +(document.getElementById("txt").value);

强迫它成一个数字

注意:

+'' === 0
+[] === 0
+[5] === 5
+['5'] === 5





1

在针对我的特殊情况尝试了大多数答案之后,我想到了:

dots = -(-dots - 5);

+符号是使js感到困惑的地方,这完全消除了它们。如果易于混淆,易于实施。


-3

自上次投票以来已更新。...

我只看到那部分

var dots = 5
function increase(){
    dots = dots+5;
}

之前,但后来向我展示了该txt框可以输入变量dots。因此,您需要确保“清除”输入,以确保输入仅包含整数,而不包含恶意代码。

一种简单的方法是使用onkeyup()事件分析文本框,以确保其具有数字字符:

<input size="40" id="txt" value="Write a character here!" onkeyup="GetChar (event);"/>

如果该值不是数字,则该事件将产生错误并清除最后一个字符:

<script type="text/javascript">
    function GetChar (event){
        var keyCode = ('which' in event) ? event.which : event.keyCode;
        var yourChar = String.fromCharCode();
        if (yourChar != "0" &&
            yourChar != "1" &&
            yourChar != "2" &&
            yourChar != "3" && 
            yourChar != "4" &&
            yourChar != "5" &&
            yourChar != "6" && 
            yourChar != "7" &&
            yourChar != "8" && 
            yourChar != "9")
        {
            alert ('The character was not a number');
            var source = event.target || event.srcElement;
            source.value = source.value.substring(0,source.value-2);
        }
    }
</script>

显然,您也可以使用正则表达式来做到这一点,但是我走了一条懒惰的路。

从那时起,您将知道框中只能有数字,您应该可以使用eval()

dots = eval(dots) + 5;

2
eval()如果dots来自用户输入,则是危险的,尤其是来自存储的输入时。更多信息
乍得利维

@ChadLevy感谢您的链接-很好的阅读-并提出了这个问题,但是在这种情况下,这种担心是不必要的,因为它不是来自用户输入的。 dots是一个定义的变量,该变量正在递增,并且被误认为是字符串。因此,我将对我的回答进行限定,如您所说,不应轻易从用户/存储的输入中使用它,因为它有可能注入恶意脚本。但在这种情况下,无论如何,这种注入仍然会导致数学错误/异常,因此,无论哪种方式,它实际上都不会做任何事情。
vapcguy

对于那些因为您认为eval()如此危险而进行投票的人,您需要在OP使用的上下文中查看代码。在这种情况下,这不是因为他使用的输入不是来自文本框,也不是来自任何其他形式的用户输入,在这些输入中可能存在任何形式的非数字值注入!希望我能投票赞成你的赞成票!
vapcguy

另一个下注者。想要说明自己,而不是仅仅作为绵羊吗?有时候,情况eval()会很好,您需要查看使用它的上下文,而不是一味地认为阅读的内容没有真正理解它!
vapcguy '16

1
@ChadLevy好吧,就这个数字而言,您是对的。我没有看那部分-我只关注他放在页面顶部的内容:代码var dots = 5 function increase(){ dots = dots+5; }不使用文本字段,而是使用直接变量(而不是来自用户输入)进行分配。这就是我的出发点。但是我看到你说的对,他正在将文本字段分配txtdots,并且dots是全局变量,因此该输入会对其进行更新。你是对的。谢谢。
vapcguy '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.