检查变量的类型

n3r*_*3rd 8 javascript

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

通常你会发现:

function isString(value) {
    return typeof value === 'string';
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

要么

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

要么

// option 3
function isString(value) {
    return (typeof value === 'string') ||
           value instanceof String;
}
Run Code Online (Sandbox Code Playgroud)

有没有"最佳"的方式来解决这个问题?或者它们都相同?

Bol*_*ock 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
Run Code Online (Sandbox Code Playgroud)

但是,与第三个选项不同,它可能不适用于具有除String()继承之外的构造函数的对象String().

我的答案使用字符串作为一个例子来反映这个问题,但同样的想法适用于Number,Boolean,Function,Object,Array和其他类型.