确定变量是否为字符串(以及数字、 bool 值等)的最佳方法是什么?
通常你会发现:
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;
}
是否有解决此问题的“最佳”方法?或者它们都是等价的?
最佳答案
在现有的三个选项中,第一个对我来说感觉很老套,因为它使用正则表达式来测试 value.constructor
的字符串表示形式。它有效,但仍然感觉很糟糕(也许只有我是这样)。
第二个选项仅适用于字符串字面值、通过连接现有对象和使用 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()
以外的构造函数的对象。
我的答案以字符串为例来反射(reflect)问题,但同样的想法适用于Number
、Boolean
、Function
、对象
、数组
等类型。
关于javascript - 检查变量的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4828535/