我试图总结一个动态数组。但由于某种原因,这些数字并没有相加,而只是相互显示。我想做1 + 2 + 3 + 4 + 5。但我的输出结果是012345而不是15。
var userInput = -1;
var totalinputs = [];
var sum = 0;
var j = 0;
While(userInput != 999)
{
userInput = window.prompt("Enter a test score, or 999 to end the program");
if(userInput <= 100 && userInput >= 0)
{
totalInputs[j] = userInput;
j++;
}
}
$("lastScore").value = totalInputs[j-1];
for(var i = 0; i < totalInputs.length; i++)
{
sum += totalInputs[i];
}
$("sumScores").value = sum;
所以当出现提示时,我输入1,2,3,4,5,同时在每个输入之间按Enter键,然后输入999结束提示。输出结果为012345而不是15.我尝试了多个选项但不确定为什么会这样做。 $函数只返回
window.document.getElementById(theId);
答案 0 :(得分:3)
替换为以下
for(var i = 0; i < totalInputs.length; i++)
{
sum += +totalInputs[i]; //this coerces string to number.
}
只需编写一个= + a, a = "1"
就可以在javascript中转换为a = 1
。这种类型的强制是JS功能。
来自提示框的用户输入是一个字符串。因此,您正面临着这个问题。
答案 1 :(得分:1)
首先,你在那个剧本中有很多拼写错误,而且很难让它发挥作用。
好的,让我们走吧:当你提示某事时,浏览器会将结果存储为字符串。如果将字符串索引0与字符串索引1相加,您将获得两者的串联,而不是总和(如您所期望的那样)。要解决此问题,您可以使用parseInt函数。
var userInput = -1;
var totalInputs = [];
var sum = 0;
var j = 0;
while(userInput != 999)
{
userInput = window.prompt("Enter a test score, or 999 to end the program");
if(userInput <= 100 && userInput >= 0)
{
totalInputs[j] = userInput;
j++;
}
}
$("lastScore").value = totalInputs[j-1];
for(var i = 0; i < totalInputs.length; i++)
{
sum += parseInt(totalInputs[i]);
}
$("sumScores").value = sum;
这将按预期工作。查看for循环中的语句。 parseInt函数。将字符串转换为Integer,然后求它。
为了使它更好,你可以存储一个Int,而不是在添加总和时强制转换它。所以你想改变这个:
userInput = window.prompt("Enter a test score, or 999 to end the program");
对此:
userInput = parseInt(window.prompt("Enter a test score, or 999 to end the program"));
然后你可以从for循环中删除parseInt。最后:
// sum += parseInt(totalInputs[i]);
sum += totalInputs[i];
答案 2 :(得分:1)
虽然您已将一个标记为答案,但我会尝试抛出自己的版本。上述两个答案仅适用于某些情况。这是为什么错误的修剪?因为你无法信任用户的输入。
@Luis的答案很好,但您是否尝试过输入像1bs64s
这样的字母数字?你会发现在解析后它会返回1号。你的用户不希望可能但如果你没关系我认为“我会停在这里”但是在用户的角度来看,它可能很奇怪,因为你允许添加字母数字。
以下是如果你是古玩的原因。
如果parseInt遇到的字符不是数字 指定的基数,它忽略它和所有后续字符和 返回解析到该点的整数值。 parseInt截断 数字到整数值。允许前导和尾随空格。
好吧,在您读完之后,您可能会说,这很容易让我只需要将radix
基数10来解决问题。不,它没有。由于程序接受0-100范围内的数字@程序员的程序仍然会接受它。
@PBd的答案也有问题,并且遭受上述同样的信念。他只是简单地将字符串强制转换为数字而没有经过适当的验证。
// this condition without properly validation returns true. Allowing `1e1` to store in array.
if("1e1" <= 100 && "1e1" >= 0) // is true!
总结后输出不同(动态打字)。
var sum = 0;
sum += totalInputs[i] // assuming totalInputs[i] returns `1e1`
console.log(sum); // the output is "01e1".
validation可能有很多版本可以保证您的安全,但IMHO会修剪用户的输入,将字符串强制转换为数字并验证输入是否可以转换为整数。
userInput = window.prompt("Enter a test score, or 999 to end the program").trim(); // or userInput = userInput.trim();
var convertedInput = +userInput;
var isNumber = convertedInput == userInput; // check equality "1" == 1
if(userInput && isNumber && convertedInput >= 0 && convertedInput <= 100)
totalInputs[j] = convertedInput;
除了简化求和外,还要使用reduce。
var sum = totalInputs.reduce(function(pv, cv) { return pv + cv; }, 0);
或在ES6中引入arrow functions,它甚至更简单:
var sum = totalInputs.reduce((pv, cv) => pv+cv, 0);
归功于@ Chaos的answer。我没有检查减少交叉浏览器性能。
Javascript很有趣! :)