当在JavaScript中使用相同的输入调用时,switch语句返回不同的结果

时间:2019-02-19 13:25:18

标签: javascript switch-statement

我正在为自己的网站编写一个Linux“控制台模拟器”作为复活节彩蛋。我使用switch语句处理给出的命令,例如:

function processCommand(command) {
    var args = command.split(" ");
    console.log(args[0]);
    var res;
    switch(args[0]) {
        case "ls":
            res = ls($(".line.new .directory", args[1], args[2]).text());
            break;
        default:
            res = args[0] + ": command not found";
    }
    $(".line.new .response").html(res);
}

这由以下JQuery调用:

$(document).keydown(function(e) {
    ...
    else if(e.which == 13) {
        $(".line.new").append('<div class="response"></div>');
        processCommand($(".line.new .input").text()); // <-------------
        $(".line").removeClass("new").addClass("old");
        $(".main").append(...);
    }
});

当我第一次输入“ ls”时,一切都按预期运行,但是第二次运行时,开关将转为默认情况。第3行的console.log(args[0])返回的值仍然相同。

我做错什么了吗?

修改

提琴:https://jsfiddle.net/L90burfq/

3 个答案:

答案 0 :(得分:2)

如果检查args[0]的长度,您会发现它第一次是2个字符,第二次是3个字符。

在检查大小写之前修改开关以修剪所有空白,它将起作用:

switch(args[0].trim())

答案 1 :(得分:1)

请参阅此https://jsfiddle.net/wkjy7du2/

var args = command.split(" ");
    var arg =args[0];
    var res;
    switch(arg.trim()) {
        case "ls":
  1. 它有一些额外的空间供第二次点击。因此可以与trim()一起使用
  2. 更好地声明为开关验证的新变量

答案 2 :(得分:1)

如果添加console.log({command});,则会看到从函数的第二次调用开始,command的值以\r(回车符)开头。

通常,应在将command分割成单词之前对其进行修剪,否则,即使在第一次调用时,其值以空格开头也会失败。