在es6中使用解构switch语句

Gio*_*nkl 1 javascript if-statement destructuring switch-statement ecmascript-6

有没有办法在switch ... case语句中使用解构功能,而不是使用嵌套的if else语句?

例如,我期望这样的事情:

const tall = true;
const clean = true;

switch ([tall, clean]) {
    case [true,true]: 
        console.log("Perfect"); 
        break;
    case [false,true]: 
        console.log("Ok"); 
        break;
    case [true,false]: 
        console.log("Not so good"); 
        break;
    default: 
        console.log("Terrible");
}
Run Code Online (Sandbox Code Playgroud)

而不是使用:

if (tall){
    if (clean){
        ...
    }else{
        ...
    }
}else{
    if (clean){
        ...
    }else{
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Ber*_*rgi 5

不,这与解构无关,不,您不能在switch语句中使用数组文字,因为不同的对象永远不会比较相等。

在这种情况下,您可以做的是将两个布尔值映射到一个整数分数:

switch (clean * 2 + tall) {
    case 3: 
        console.log("Perfect");
        break;
    case 2: 
        console.log("Ok");
        break;
    case 1: 
        console.log("Not so good");
        break;
    case 0: 
        console.log("Terrible");
}
Run Code Online (Sandbox Code Playgroud)

或等效的数组查找:

console.log(["Terrible", "Not so good", "Ok", "Perfect"][clean * 2 + tall]);
Run Code Online (Sandbox Code Playgroud)

您甚至可能希望使按位魔术更明显:

switch (tall << 1 | clean << 0) {
    case true << 1 | true << 0:
        console.log("Perfect"); 
        break;
    case false << 1 | true << 0:
        console.log("Ok"); 
        break;
    case true << 1 | false << 0:
        console.log("Not so good"); 
        break;
    case false << 1 | false << 0:
        console.log("Terrible");
        break;
}
Run Code Online (Sandbox Code Playgroud)

您也可以function score(a, b) { return a << 1 | b << 0 }同时在switch和中调用帮助程序case