* @static
*/
QueryString.stringify = QueryString.encode = function (obj, sep, eq, munge, name) {
- munge = typeof(munge) == "undefined" ? true : munge;
+ munge = typeof(munge) == "undefined" || munge;
sep = sep || "&";
eq = eq || "=";
- if (isA(obj, null) || isA(obj, undefined) || typeof(obj) === 'function') {
+ if (obj == null || typeof(obj) === 'function') {
return name ? QueryString.escape(name) + eq : '';
}
return (qs || '')
.split(sep||"&")
.map(pieceParser(eq||"="))
- .reduce(mergeParams)
+ .reduce(mergeParams);
};
// Parse a key=val string.
// else merge them as objects, which is a little more complex
: mergeObjects(params, addition)
);
-};
+}
// Merge two *objects* together. If this is called, we've already ruled
// out the simple cases, and need to do a loop.
}
}
return params;
-};
+}
-// duck typing
function isA (thing, canon) {
- return (
- // truthiness. you can feel it in your gut.
- (!thing === !canon)
- // typeof is usually "object"
- && typeof(thing) === typeof(canon)
- // check the constructor
- && Object.prototype.toString.call(thing) === Object.prototype.toString.call(canon)
- );
-};
+ // special case for null and undefined
+ if (thing == null || canon == null) {
+ return thing === canon;
+ }
+ return Object.getPrototypeOf(Object(thing)) == Object.getPrototypeOf(Object(canon));
+}
function isBool (thing) {
- return (
- typeof(thing) === "boolean"
- || isA(thing, new Boolean(thing))
- );
-};
+ return isA(thing, true);
+}
function isNumber (thing) {
- return (
- typeof(thing) === "number"
- || isA(thing, new Number(thing))
- ) && isFinite(thing);
-};
+ return isA(thing, 0) && isFinite(thing);
+}
function isString (thing) {
- return (
- typeof(thing) === "string"
- || isA(thing, new String(thing))
- );
-};
+ return isA(thing, "");
+}