可以使用不带引号的数组值吗?

时间:2014-03-05 17:43:07

标签: javascript arrays

你必须原谅我,我是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”数组的值中删除引号,希望它可以工作,但是当它以这种方式运行时,脚本都不会运行,调试器声称它是语法错误?我做错了什么,我该如何解决?

3 个答案:

答案 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");
}