繁体   English   中英

是“if”或“switch”更喜欢Javascript

[英]Is “if” or “switch” preferable Javascript

我正在构建一个函数,它在运行代码块之前验证用户的输入在应用程序的上下文中是否有意义。 我想知道像这样的“if ... else”语句或switch语句是否会更可靠地工作/否则是一个更好的解决方案? 我倾向于if ... else因为我只有两个结果 - 用户的输入有效或者告诉用户程序将接受什么,但我希望在我太介入之前从更有经验的人那里获得建议。

编辑:为清楚起见,我只希望我的代码在i和o既是“a”或“b”,也可以是“c”或“d”,或者都是“e”或“f”时执行。

    console.log("i="+i+" o="+o);
    if      
    (((i == ("a" || "b")) && (o == ("a" || "b")))
    ||  ((i == ("c" || "d")) && (o == ("c" || "d")))
    ||  ((i == ("e" || "f")) && (o == ("e" || "f"))))
    {
        //my block here
    }       
    else
    {
        //tell the user their input doesn't make sense
    }

另外,在这种情况下我是否正确处理了我的布尔运算符?

首先,你的if语句是错误的,因为JavaScript布尔表达式被强制转换为布尔值。

含义:

'a'  ||  'b'

将始终返回'a'因为'a'计算结果为true ,而JS引擎无需检查||的第二个操作数 声明。

所以你的if语句应如下所示:

if(((i == "a" || i == "b") && (o == "a" || o == "b")) ||
   ((i == "c" || i == "d") && (o == "c" || o == "d")) ||
   ((i == "e" || i == "f") && (o == "e" || o == "f"))

您可以尝试使用下面的简单解决方案,而不是使用那么多可能使其无法读取的块或块。

在这个解决方案中,我们首先创建一个允许值的映射,并且对于每个值,第二个变量的允许组合是什么,然后我们检查映射中是否存在a的值,如果是,那么我们检查i的值是否为允许组合中的允许值

 function test(a, i) { var map = { a: ['a', 'b'], b: ['a', 'b'], c: ['c', 'd'], d: ['c', 'd'], e: ['e', 'f'], f: ['e', 'f'] }; if (map[a] && map[a].indexOf(i) > -1) { console.log('found', a, i, result === true) } else { console.log('not found', a, i, result === false) } } 

首先,您的Javascript不起作用,因为非空字符串计算为true ,因此("c" || "d")只评估为“c”。 意思是你当前正在检查的是io是相同的值。

实际上,这实际上覆盖了你需要的一半案例(如果io相等,你肯定会继续,无论他们是"a""b"等)。

你想要的逻辑是这样的:

if( ((i == "a" || i == "b") && (o == "a" || o == "b")) ||
    ((i == "c" || i == "d") && (o == "c" || o == "d")) ||
    ((i == "e" || i == "f") && (o == "e" || o == "f"))
){
    // valid
} else {
    // invalid
}

我喜欢那种if语句令人费解的switch ,你可能会结束。

你也可以这样接近它。 你意识到io之间的关系不会超过一个字母,所以你可以编写这样的逻辑:

if( Math.abs(i.charCodeAt(0) - o.charCodeAt(0)) <= 1 ){
    // valid
} else {
    // invalid
}

这就是说,只要io是相同的字母或不超过一个(使用它们的ASCII值进行比较),它就是有效的。 是一个演示。

check("a", "a")
// true
check("a", "b")
// true
check("a", "c")
// false
check("e", "f")
// true
check("a", "a")
// true
check("b", "a")
// true

你也可以这样做:

var i='a', o='b', 
    allowed = [['a','b'], ['c', 'd'], ['e', 'f']];
function test(one, two) { 
    return allowed.some(function(elem) {
        return (elem.indexOf(one)>=0 && elem.indexOf(two)>=0);
    });
}
console.log(test(i, o));

拥有所有允许值对的数组,然后使用Array.prototype.some()来测试您的io是否在允许的值范围内。 .some()将为数组中的每个元素执行一次回调函数,直到找到一个回调返回true值的元素。 如果找到这样的元素,它会立即返回true。

这是一个片段

 // Only for this snippet console.log = function(txt) { var result = document.getElementById("result"); result.innerText += txt + ", "; } // allowed values var i, o, allowed = [['a','b'], ['c', 'd'], ['e', 'f']]; // function to test function test(one, two) { return allowed.some(function(elem) { return (elem.indexOf(one)>=0 && elem.indexOf(two)>=0); }); } // all tests i = 'a'; o = 'b'; console.log(test(i, o)); i = 'c'; o = 'd'; console.log(test(i, o)); i = 'e'; o = 'f'; console.log(test(i, o)); i = 'a'; o = 'c'; console.log(test(i, o)); i = 'd'; o = 'e'; console.log(test(i, o)); i = 'x'; o = 'y'; console.log(test(i, o)); 
 <p id="result"></p> 

和小提琴一起玩: http//jsfiddle.net/abhitalks/sfuxv4ov/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM