util: more strict check for bool/number/string

This commit is contained in:
Yorkie 2013-12-15 05:09:28 +08:00 committed by Fedor Indutny
parent 8a79cca80c
commit 95ee84fabe
4 changed files with 39 additions and 5 deletions

View 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 '';

View 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;

View 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': ''}],

View 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()));