diff --git a/lib/url.js b/lib/url.js index bb11144f7a33bc..8b9f92856d41b2 100644 --- a/lib/url.js +++ b/lib/url.js @@ -60,6 +60,12 @@ const slashedProtocol = { }; const querystring = require('querystring'); +// This constructor is used to store parsed query string values. Instantiating +// this is faster than explicitly calling `Object.create(null)` to get a +// "clean" empty object (tested with v8 v4.9). +function ParsedQueryString() {} +ParsedQueryString.prototype = Object.create(null); + function urlParse(url, parseQueryString, slashesDenoteHost) { if (url instanceof Url) return url; @@ -168,7 +174,7 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { } } else if (parseQueryString) { this.search = ''; - this.query = {}; + this.query = new ParsedQueryString(); } return this; } @@ -358,7 +364,7 @@ Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { } else if (parseQueryString) { // no query string, but parseQueryString still requested this.search = ''; - this.query = {}; + this.query = new ParsedQueryString(); } var firstIdx = (questionIdx !== -1 && diff --git a/test/parallel/test-url.js b/test/parallel/test-url.js index 760303e98bb6bb..1499fb87335294 100644 --- a/test/parallel/test-url.js +++ b/test/parallel/test-url.js @@ -927,7 +927,7 @@ var parseTestsWithQueryString = { path: '/example', href: '/example' }, - '/example?query=value':{ + '/example?query=value': { protocol: null, slashes: null, auth: null, @@ -951,6 +951,8 @@ for (const u in parseTestsWithQueryString) { } } + assert.notStrictEqual(Object.getPrototypeOf(actual.query), Object.prototype); + assert.deepEqual(actual, expected); }