Javascript: 值不能通过一个条件,尽管它是真的

Javascript: Value cannot pass through a condition although it is true

当我做一些事情的时候,我发现了一个奇怪的问题。 我尝试进行语音识别。条件的第一部分工作正常,但第二部分不工作。

var v;

function test() {
  var ses = new webkitSpeechRecognition();
  ses.lang = "En"
  ses.continuous = true;
  ses.start();
  ses.onresult = function(event)
    if (event.results.length > 0) {
      sonuc = event.results[event.results.length - 1];
      document.querySelector("input").value = sonuc[0].transcript;
      v = sonuc[0].transcript;
      console.log(v + " 1");

      if (v == "good") {
        switchLED('on');
        console.log(v + "2");
        console.log("OK !");
        console.log("LED ok");
      }

      if (v == "bad") {
        switchLED('off');
        console.log(v + "2");
        console.log("OK !");
        console.log("LED off");
      }
    }
  }

第一次,我说:good 结果是:

good 1 
good 2
OK ! 
LED OK

这是正确的。

然后,如果我第二次说:bad 结果是:

bad 1

并且没有通过条件if(v == "bad")

只有在 bad 是我说的第二个词时才会发生。如果我第一次刷新页面直接说"bad",我会得到所有正确的结果。

根据Mozzila's documentation

For continuous recognition, leading or trailing whitespace will be included where necessary so that concatenation of consecutive SpeechRecognitionResults produces a proper transcript of the session.

完全符合您的描述。由于您的语音识别会话是连续的(如 ses.continuous = true 中所示),因此当您第一次说出任何单词时,转录器将正确地获取该单词。但是当它识别出下一个单词时,会添加一个前导空格。您可能误复制了您的控制台输出,它一定是这样的:

good 1 
good 2
OK ! 
LED OK

 bad 1 
^ leading space here

的确," bad" 不等于 "bad"。这就是字符串没有通过条件的原因。要解决这个问题,只需确保 trim 您的字符串:

var v;

function test() {
  var ses = new webkitSpeechRecognition();
  ses.lang = "En"
  ses.continuous = true;
  ses.start();
  ses.onresult = function(event)
    if (event.results.length > 0) {
      sonuc = event.results[event.results.length - 1];
      document.querySelector("input").value = sonuc[0].transcript;
      v = sonuc[0].transcript.trim(); // <-- trim here
      console.log(v + " 1");

      if (v == "good") {
        switchLED('on');
        console.log(v + "2");
        console.log("OK !");
        console.log("LED ok");
      }

      if (v == "bad") {
        switchLED('off');
        console.log(v + "2");
        console.log("OK !");
        console.log("LED off");
      }
    }
  }

那么您的代码应该会按预期工作。希望对您有所帮助!