Creating and parsing query strings
Well this is a fascinating question!

I don't see much you could do in createQueryString besides potentially using Object.entries instead of Object.keys and a slight rearrangement to get rid of the outer template string.

const createQueryString = input =&gt; 
  '?' + encodeURI(Object.entries(input)
    .map(([name, value]) =&gt; `${name}=${value}`).join('&amp;'));


Do note that there is a problem here if your name or value contains &amp;. To fix this you would need to call encodeURIComponent on each part and then drop the outer enocdeURI call. 

const createQueryString = input =&gt; 
  '?' + Object.entries(input)
    .map(([name, value]) =&gt; 
      `${encodeURIComponent(name)}=${encodeURIComponent(value)}`
    ).join('&amp;');


parseQueryString can be improved in several ways. 


You don't use obj = Object.create(null), so get rid of it. 
There is a (mostly) a built in way to do this which I will pretend doesn't exist for the rest of this post. (One disadvantage with this method is that it requires a full URI, not just the query string)

[...new URL(uri).searchParams.entries()]
    .reduce((obj, entry) =&gt; Object.assign(obj, { [entry[0]]: entry[1] }), {})

You can use regular expressions to simplify the code slightly. 

const parseQueryString = (input) =&gt; 
  input.slice(input.indexOf('?') + 1)
  .match(/[\w\d%\-!.~'()\*]+=[\w\d%\-!.~'()\*]+/g)
  .map(s =&gt; s.split('=').map(decodeURIComponent))
  .reduce((obj, [key, value]) =&gt; Object.assign(obj, { [key]: value }), {})



Full demo:



const createQueryString = input =&gt; 
  '?' + Object.entries(input)
    .map(([name, value]) =&gt; 
      `${encodeURIComponent(name)}=${encodeURIComponent(value)}`
    ).join('&amp;');

const queryString = createQueryString({
  name: 'Darrell',
  age: '3     2',
  nationality: 'Swedish',
  messy: '&amp;hi=bye'
});

const parseQueryString = input =&gt; 
  input.slice(input.indexOf('?') + 1)
  .match(/[\w\d%\-!.~'()\*]+=[\w\d%\-!.~'()\*]+/g)
  .map(s =&gt; s.split('=').map(decodeURIComponent))
  .reduce((obj, [key, value]) =&gt; Object.assign(obj, { [key]: value }), {})

const parsedQueryString = parseQueryString(queryString);

console.log(parsedQueryString)