Is JavaScript switch statement linear or constant time?

这一生的挚爱 提交于 2019-12-23 19:05:08

问题


I have the following JavaScript on my site so that when certain specific searches are performed, the answer is hardcoded to a specific page:

function redirect() {
    var input = document.getElementById('searchBox').value.toLowerCase();

    switch (input) {
      case 'rectangular':
        window.location.replace('http://www.Example.com/Rectangular/');
        break;
      case 'elephant':
        window.location.replace('http://www.Example.com/Elephants/');
        break;
      case 'coils':
        window.location.replace('http://www.Example.com/Parts/');
        break;
      default: // No keyword detected: submit the normal search form.
        return true;
        break;
    }
    return false; // Don't let the form submit
}

I'm wondering whether the search statement in JavaScript is linear on the number of case statements or constant time? If linear, is there a better way to write this code so it is constant time regardless of the number of special cases I code?


回答1:


Here's the equivalent of Bergi's answer in ES5. It'll be fast and also a lot easier to modify compared to what you're using now.

var _redirectlist = {
  'rectangular': 'http://www.Example.com/Rectangular/',
  'elephant': 'http://www.Example.com/Elephants/',
  'coils': 'http://www.Example.com/Parts/'
};

function redirect() {
  var input = document.getElementById('searchBox').value.toLowerCase();

  // Redirect if we have the input in our list
  if (_redirectlist.hasOwnProperty(input)) {
    window.location.replace(_redirectlist[input]);
    return false;
  }

  return true;
}



回答2:


The spec does not make any time complexity guarantees for the switch statement. It's semantics to do require a sequential evaluation of the case expressions however, so in the general case it behaves linearly.

Engines are free to optimise the evaluation if all of the cases are constant strings or numbers (and it's fairly simple), so you can expect constant time complexity.

If you want to enforce a better-than-linear behaviour, you need to use a Map as a lookup table:

var redirects = new Map([
    ['rectangular', 'http://www.Example.com/Rectangular/'],
    ['elephant', 'http://www.Example.com/Elephants/'],
    ['coils', 'http://www.Example.com/Parts/']
]);
function redirect() {
    var input = document.getElementById('searchBox').value.toLowerCase();
    if (redirects.has(input)) {
        window.location.replace(redirects.get(input));
        return false; // Don't let the form submit
    } else {
        return true;
    }
}

In a pre-ES6 environment, you can also use an object for the same purpose. All engines have implemented O(1) property lookup although they're not formally required to.



来源:https://stackoverflow.com/questions/41109196/is-javascript-switch-statement-linear-or-constant-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!