检查变量的类型

时间:2011-01-28 13:08:33

标签: javascript

找出变量是否为字符串的最佳方法是什么(同样,数字,布尔值等)?

通常你会发现:

function isString(value) {
    return typeof value === 'string';
}

但人们忘记了也可以使用var foo = new String("bar");直接创建字符串对象 - 这是否是一个好主意是完全不同的事情。

那么去这里的方式是什么?我能想到 - 并且已经看到 - 各种方法(有些简化):

// option 1
function isString(value) {
    return (typeof value === 'string') ||
           /^function String\(\)/.test(value.constructor + '');
}

// option 2
function isString(value) {
    return (typeof value === 'string') ||
           (value.constructor === String);
}

// option 3
function isString(value) {
    return (typeof value === 'string') ||
           value instanceof String;
}

有没有“最佳”的方式来解决这个问题?或者它们都是等价的?

1 个答案:

答案 0 :(得分:5)

在现有的三个选项中,第一个选项对我来说相当粗俗,因为它使用正则表达式来测试value.constructor的字符串表示。它有效,但它仍然感觉很hacky(也许只是我)。

第二个选项仅适用于字符串文字,通过连接现有对象创建的字符串和使用new String()构造函数创建的对象,而第三个选项适用于使用new String()构造函数创建的对象或任何继承自String() 的其他对象(我不确定JavaScript继承;有人可以确认吗?)

constructor属性也存在于基元/文字中,而不仅仅是使用new创建的包装器对象。这使得第二个选项中的typeof检查非常多余:

function isString(value) {
    return value.constructor === String;
}

alert(isString("test1"));             // true
alert(isString(new String("test2"))); // true

但是,与第三个选项不同,它可能不适用于继承自String()的{​​{1}}以外的构造函数的对象。

我的回答使用字符串作为示例来反映问题,但同样的想法适用于String()NumberBooleanFunctionObject和其他类型。