繁体   English   中英

检查变量的类型

[英]Checking the type of a variable

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

通常您会发现:

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

但是人们忘记了,也可以直接使用var foo = new String("bar");创建字符串对象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;
}

是否有“最佳”方法来解决此问题? 还是全部等同?

在现有的三个选项中,第一个对我来说感觉很棘手,因为它使用正则表达式测试value.constructor的字符串表示value.constructor 它可以工作,但是仍然感觉很笨拙(也许只是我一个人)。

第二个选项仅适用于字符串文字,通过连接现有对象和使用new String()构造函数创建的对象而创建的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()从继承String()

我的答案以字符串为例来反映问题,但相同的想法也适用于NumberBooleanFunctionObjectArray和其他类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM