你必须原谅我,我是JavaScript的新手......就像几个星期新的一样。无论如何,我使用JavaScript创建了一个代码来生成两个随机数,要求添加它们,并根据用户响应给出“那是正确的/那是不正确的”答案。我想将其他符号( - ,*,/)添加到等式中,并决定尝试在数组中执行此操作。以下是我到目前为止的情况:
<head>
<meta charset="utf-8" />
<title>Math Games</title>
</head>
<body>
<script>
var Answer;
var numbers=new Array();
var signs=new Array();
var Signs2=new Array();
var SignNoQuote=new Array();
numbers[0]=(Math.floor(Math.random() * 10 + 1));
numbers[1]=(Math.floor(Math.random() * 10 + 1));
signs[0]="+";
signs[1]="-";
signs[2]="*";
signs[3]="/";
SignNoQuote[0]="+";
SignNoQuote[1]="-";
SignNoQuote[2]="*";
SignNoQuote[3]="/";
Signs2[0]=(Math.floor(Math.random() * 4));
Answer=window.prompt("What is " + numbers[0] + signs[Signs2[0]] + numbers[1] + "?");
if(Answer==numbers[0] + SignNoQuote[Signs2[0]] + numbers[1])
{
window.alert("That's Correct!");
}
else
{
window.alert("That is Incorrect");
}
</script>
<a href="file:///E:/ECS/Legitimate%20Work/mathtest.html">Refresh</a>
</body>
它正确地问了这个问题,但是当给出正确的答案时,它说它是不正确的。我尝试从“SignNoQuote”数组的值中删除引号,希望它可以工作,但是当它以这种方式运行时,脚本都不会运行,调试器声称它是语法错误?我做错了什么,我该如何解决?
答案 0 :(得分:5)
如果你想要一个特定于你的用例的东西,这将很好地工作:
//A mapping from the symbol for an operation to
//the function that executes it.
var opFunction = {
"+": function (x, y) { return x + y; },
"-": function (x, y) { return x - y; },
"*": function (x, y) { return x * y; },
"/": function (x, y) { return x / y; }
};
//Gets the operation symbol.
var op = SignNoQuote[Signs2[0]];
//Looks up the function for the operation,
//then calls it with your numbers as operands.
var result = opFunction[op](numbers[0], numbers[1]);
但是,如果你需要一些通用的东西来评估数学表达式,布拉德的答案就会提供你需要的东西。
答案 1 :(得分:3)
如果我理解这个问题,你会尝试使用符号字符串来进行数学运算。
numbers[0] + SignNoQuote[Signs2[0]] + numbers[1]
问题在于,+
表示在字符串上下文中使用时连接。代码中没有+
运算符,您的文本字符串包含一个字符+
。这些根本不同。它没有什么不同:
numbers[0] + '+' + numbers[1]
....导致类似这样的事情:
"1+2"
您需要做的是以某种方式执行该输入,例如使用eval()
。不幸的是,这是您遇到一些可怕的安全问题,允许用户执行他们想要的任何事情。在某些情况下,这可能是安全的,但通常不是。
您可以选择运行此等式。有关详细信息,请参阅此问题:Evaluating a string as a mathematical expression in JavaScript
答案 2 :(得分:0)
当您检查答案时,请使用比较:
numbers[0] + SignNoQuote[Signs2[0]] + numbers[1]
但假设你希望它成倍增加,那实际上就是:
2 + "*" + 1
与...不同:
2 * 1
最简单的方法可能是使用if ... else if ... else if ...语句。类似的东西:
var answerCorrect = false;
if (SignNoQuote[Signs2[0]] == "+") {
answerCorrect = (Answer == numbers[0] + numbers[1]);
} else if (SignNoQuote[Signs2[0]] == "*") {
answerCorrect = (Answer == numbers[0] * numbers[1]);
} else if (etc ...
然后:
if(answerCorrect) {
window.alert("That's Correct!");
} else {
window.alert("That is Incorrect");
}