querystring: using toString for objects on querystring.escape
querystring.encode
unexpected behavior on objects, see #5309 (closed)
here is specs for encodeURIComponent
- http://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3.4, so object must be casted to string via toString
, not via valueOf
.
const qs = require('querystring');
const testObject = { toString: () => 'test', valueOf: () => 5 };
console.log('expected', encodeURIComponent(testObject)); // 'test'
console.log('actual', qs.escape(testObject)); // 5
Here is why:
> '' + {toString: () => 'test', valueOf: () => 5}
5
String({toString: () => 'test', valueOf: () => 5})
'test'