为什么我们应该在开关条件下解析值,而不是在 if 条件下解析值



function runif() {
  let a = document.getElementById('test').value;
  if (a == 1) {
    console.log("works");
  }
}
function runswitch() {
  let a = document.getElementById('test').value;
  switch (a) {
    case 1:
      console.log("working");
      break;
    default:
      break;
  }
}
function runswitchOne() {
  let a = parseInt(document.getElementById('test').value);
  switch (a) {
    case 1:
      console.log("working");
      break;
    default:
      break;
  }
}
<form action="">
  <input type="text" id="test">
  <input type="button" onclick="runif()" value="click to check if">
  <input type="button" onclick="runswitch()" value="click to check without parseInt">
  <input type="button" onclick="runswitchOne()" value="click to check with parseInt">
</form>

这是我使用文本输入和两个按钮创建的表单。

其中 if 语句识别输入并执行操作

但是在开关中,我必须使其解析才能识别

我不明白它为什么有效?我知道文本输入会很刺痛,但如果是这样,if(( 语句如何在不解析的情况下工作?

通常我们使用 if(a == "1"( 来比较字符串而不是 if(a==1(?

但即便如此,它还是有效的

开关情况进行严格比较(检查类型(。

元素的值为字符串类型。内部开关外壳值为 int 类型且不匹配。因此,如果没有转换,您的代码将不起作用。

但是当使用a == 1时,只检查而不是类型,并且"1" == 1计算结果为 true。如果你做严格的比较(例如,===(,"1" === 1计算结果为 false,因为在这种情况下,虽然值相等但类型不相等。

以下方法将起作用:

switch (a) {
    case "1":
         .....

你可以在不解析的情况下让它工作,只需将switch( 1 (中的预期值更改为字符串("1"(:

switch (a) {
    case "1":
        //Rest of code
}

当然,在if语句中使用==时,这会为您进行类型转换(1 == "1"(。在switch中,它的行为类似于===(相等运算符,不执行类型强制(。

最新更新