util: more strict check for bool/number/string
authorYorkie <yorkiefixer@gmail.com>
Sat, 14 Dec 2013 21:09:28 +0000 (05:09 +0800)
committerFedor Indutny <fedor.indutny@gmail.com>
Wed, 18 Dec 2013 13:58:02 +0000 (17:58 +0400)
lib/querystring.js
lib/util.js
test/simple/test-querystring.js
test/simple/test-util.js

index e9ff825..7437c29 100644 (file)
@@ -118,7 +118,7 @@ var stringifyPrimitive = function(v) {
   if (util.isString(v))
     return v;
   if (util.isBoolean(v))
-    return v ? 'true' : 'false';
+    return v == true ? 'true' : 'false';
   if (util.isNumber(v))
     return isFinite(v) ? v : '';
   return '';
index a03e874..fb64a44 100644 (file)
@@ -451,7 +451,7 @@ function isArray(ar) {
 exports.isArray = isArray;
 
 function isBoolean(arg) {
-  return typeof arg === 'boolean';
+  return typeof arg === 'boolean' || objectToString(arg) === '[object Boolean]';
 }
 exports.isBoolean = isBoolean;
 
@@ -466,12 +466,12 @@ function isNullOrUndefined(arg) {
 exports.isNullOrUndefined = isNullOrUndefined;
 
 function isNumber(arg) {
-  return typeof arg === 'number';
+  return typeof arg === 'number' || objectToString(arg) === '[object Number]';
 }
 exports.isNumber = isNumber;
 
 function isString(arg) {
-  return typeof arg === 'string';
+  return typeof arg === 'string' || objectToString(arg) === '[object String]';
 }
 exports.isString = isString;
 
index 483982c..2b4308e 100644 (file)
@@ -83,7 +83,12 @@ var qsWeirdObjects = [
   [{e: extendedFunction}, 'e=', {'e': ''}],
   [{d: new Date()}, 'd=', {'d': ''}],
   [{d: Date}, 'd=', {'d': ''}],
-  [{f: new Boolean(false), t: new Boolean(true)}, 'f=&t=', {'f': '', 't': ''}],
+  [{
+    f: new Boolean(false),
+    t: new Boolean(true)},
+    'f=false&t=true',
+    {'f': 'false', 't': 'true'}
+  ],
   [{f: false, t: true}, 'f=false&t=true', {'f': 'false', 't': 'true'}],
   [{n: null}, 'n=', {'n': ''}],
   [{nan: NaN}, 'nan=', {'nan': ''}],
index 4e75d51..07b3f6d 100644 (file)
@@ -25,6 +25,35 @@ var assert = require('assert');
 var util = require('util');
 var context = require('vm').runInNewContext;
 
+// isBoolean
+assert.equal(true, util.isBoolean(true));
+assert.equal(true, util.isBoolean(false));
+assert.equal(true, util.isBoolean(Boolean()));
+assert.equal(true, util.isBoolean(new Boolean()));
+assert.equal(true, util.isBoolean(new Boolean(true)));
+assert.equal(true, util.isBoolean(context('Boolean')()));
+assert.equal(false, util.isBoolean({}));
+assert.equal(false, util.isBoolean(/regexp/));
+
+// isNumber
+assert.equal(true, util.isNumber(0));
+assert.equal(true, util.isNumber(NaN));
+assert.equal(true, util.isNumber(Number()));
+assert.equal(true, util.isNumber(new Number()));
+assert.equal(true, util.isNumber(new Number(10)));
+assert.equal(true, util.isNumber(context('Number')()));
+assert.equal(false, util.isNumber({}));
+assert.equal(false, util.isNumber(/regexp/));
+
+// isString
+assert.equal(true, util.isString('string'));
+assert.equal(true, util.isString(String()));
+assert.equal(true, util.isString(new String()));
+assert.equal(true, util.isString(new String(10)));
+assert.equal(true, util.isString(context('String')()));
+assert.equal(false, util.isString({}));
+assert.equal(false, util.isString(/regexp/));
+
 // isArray
 assert.equal(true, util.isArray([]));
 assert.equal(true, util.isArray(Array()));