Javascript 函数中的行为问题-+=

Javascript 函数中的行为问题-+=,javascript,function,object,operation,Javascript,Function,Object,Operation,我的项目涉及用户从HTML的输入文本框中提供一个数字(在我的示例中,我一直在使用数字3000)。然后在我的外部js文件(在head标记中声明)中,我将一个变量声明为具有属性的对象 基本上,在文本框中键入金额,然后单击按钮。单击时,它调用外部javascript文件,该文件包含一个属性为delared的对象,以及一个在单击按钮时开始执行的函数 在函数内部,您可以看到它从HTML文件的输入框中提取数值,并更改对象属性(并将结果输出到控制台日志) 令人头痛的是,当它执行运算符“account.savi

我的项目涉及用户从HTML的输入文本框中提供一个数字(在我的示例中,我一直在使用数字3000)。然后在我的外部js文件(在head标记中声明)中,我将一个变量声明为具有属性的对象

基本上,在文本框中键入金额,然后单击按钮。单击时,它调用外部javascript文件,该文件包含一个属性为delared的对象,以及一个在单击按钮时开始执行的函数

在函数内部,您可以看到它从HTML文件的输入框中提取数值,并更改对象属性(并将结果输出到控制台日志)

令人头痛的是,当它执行运算符“account.savings-=z;”时,它工作完美,并生成account.savings-3000(65247)…的预期结果,但当account.checking+=z;然后执行,它将两个值混合在一起,而不是添加它们(50043000而不是8004)

我试着把account.checking添加到3000这个数字上,效果非常好

TL:DR-函数执行时,acount.savings-=z;工作正常,并显示在控制台日志中,但acount.savings+=z;合并号码,而不是将其添加到控制台日志中

var账户={
支票号码:5004,
节省:68247
};
函数数学{
var z=document.getElementById('amount')。值;
账户储蓄-=z;
console.log(account.savings);
账户检查+=z;
控制台日志(帐号检查);
}
金额
javaScript 5004(数字)+“3000”(字符串)中的传输等于“50043000”(字符串) 您应该以某种方式验证您的输入并将其转换为数字,以确保它在函数中传递的量正确。例如:

var account = { checking: 5004, savings: 68247 };
function maths() {
    var z = document.getElementById('amount').value;
    z = parseInt(z);

    account.savings -= z;
    console.log(account.savings);

    account.checking += z;
    console.log(account.checking);
}

maths();
需要注意的一点是:如果您想处理小数而不仅仅是整数,
parseInt
将不适用于您。我同意ImanGM的观点,输入验证应该得到处理,但要回答这个问题

正在执行字符串连接而不是添加。这是因为
document.getElementById('amount')。value
给我们一个字符串。您可以通过以下方式规避此问题:

account.checking+=编号(z);

账户检查+=+z应该是一个快速修复;考虑检查<代码> +/>代码可以是字符串连接,而<代码> ->代码>强制JavaScript的不一致性是另一个原因。我想对JunrSape的回复进行投票。但是我不知道如何将Z作为Actudio。储蓄作为一个数字(如预期的)和会计检查。它变成了一个字符串…(3000)我看不到z从数字变成字符串的地方。我一定会尝试你的解决方案。我只是想知道为什么我认为某些东西的行为改变会被同样对待。它确实有效,但我只是想知道为什么?为什么需要验证?同样是新的,但是为什么如果它适用于一个表达式(相同类型),那么它不适用于后面的表达式(中间没有更改代码)?请使用
parseInt
。考虑使用或替代,或者专门针对<代码> <代码> s。@ GR3GAMMETJavaScript是一种松散类型的语言。当您将字符串数字(如“3000”)添加到实数(如10)时,由于无法将数字添加到字符串中,因此它会将数字转换为字符串并合并变量。但是,当您使用“-”运算符时,不可能基于另一个字符串删除字符串的一部分,因此,它会将字符串编号转换为一个数字,然后执行该操作。这就是为什么“10”+5等于105,但“10”-5等于5。但是为什么帐户储蓄z被正确地视为一个数字,而帐户储蓄z被视为一个字符串?是的,很快我会引入小数。所以我对你的意见很感兴趣。谢谢@Gr3ghammett这样做的原因是,对于
account.savings
,您使用的是
-=
,它只能用于数字,不能用于字符串。使用
帐户。检查
您正在使用的
+=
,这对字符串连接和加法都有效。因此,只有
-=
导致
z
从字符串自动转换为数字。