Corrected getParameterByName3 (v15)

Revision 15 of this benchmark created by falcacibar on


Description

getParameterByName3 would bork if other variables on the query string ended in the same text as the name of the one to return, as pointed out by a comment on SO.

Preparation HTML

<script>
    var location_search = "?q=hol+nse+qu+cirde&nose=%34sdnf%2f&43&l=1"
        , testDebug     = []
    ;

    (function () {
        var location = {};
        location.search = location_search;

        window.GetQueryString = function (q) {
            return (function (a) {
                if (a == "") return {};
                var b = {};
                for (var i = 0; i < a.length; ++i) {
                    var p = a[i].split('=');
                    if (p.length != 2) continue;
                    b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
                }
                return b;
            })(q.split("&"));
        };

        window.getParameterByName = function (name) {
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));

        }

        window.getParameterByName2 = function (name) {
            var match = RegExp('[?&]' + name + '=([^&]*)').exec(location.search);
            return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
        }

        window.getParameterByName3 = function (n) {
            var half = location.search.split(n + '=')[1];
            return half ? decodeURIComponent(half.split('&')[0].replace(/\+/g, ' ')) : null;
        }
        
        window.test_debug = function() {
           if(typeof(window.debug)==='undefined') return;
           var t = arguments[0];
           if(typeof(window.debug[t])==='undefined'){
              console.log.apply(console, Array.prototype.slice.call(arguments, 0));
              window.debug[t] = true;
           }
        }
    })();
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
Split method
var qs = window.GetQueryString(location_search.substr(1))
  , search = qs["q"]
  , value = qs["nose"]
  , undef = qs["undefinedstring"]
;

test_debug(1, search,value,undef);
 
ready
Regex method
var search = window.getParameterByName("q")
  , value = window.getParameterByName("nose")
  , undef = window.getParameterByName("undefinedstring")
;

test_debug(2, search,value,undef);
ready
Another....
var  search = window.getParameterByName2("q")
  , value = window.getParameterByName2("nose")
  , undef = window.getParameterByName2("undefinedstring")
;

test_debug(3, search,value,undef);
ready
simplest and faster but inaccurate!
var search = window.getParameterByName3("q")
  , value = window.getParameterByName3("nose")
  , undef = window.getParameterByName3("undefinedstring")
;

test_debug(4, search,value,undef);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.