Javascript 检查变量的类型
确定变量是否为字符串(以及数字、布尔值等)的最佳方法是什么 通常你会发现:Javascript 检查变量的类型,javascript,Javascript,确定变量是否为字符串(以及数字、布尔值等)的最佳方法是什么 通常你会发现: function isString(value) { return typeof value === 'string'; } 但是人们忘记了,也可以直接使用var foo=newstring(“bar”)-这是不是一个好主意是一个完全不同的问题 那么这里怎么走?我可以想到——并且已经看到——各种方法(有些简化): 或 或 有没有“最好”的办法?或者它们都是等价的?在现有的三个选项中,第一个选项让我感觉相当不舒服
function isString(value) {
return typeof value === 'string';
}
但是人们忘记了,也可以直接使用var foo=newstring(“bar”)代码>-这是不是一个好主意是一个完全不同的问题
那么这里怎么走?我可以想到——并且已经看到——各种方法(有些简化):
或
或
有没有“最好”的办法?或者它们都是等价的?在现有的三个选项中,第一个选项让我感觉相当不舒服,因为它使用正则表达式来测试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()
的对象
我的答案以字符串为例来反映问题,但同样的想法也适用于数字
,布尔
,函数
,对象
,数组
和其他类型不过,它并没有真正回答这个问题。@n3rd:除了它不是现有的三个选项之一之外,它怎么没有回答这个问题?+1.正准备发布此消息。这个消息是否吸引人(喘息)不过字符串的子类?@Skurmedel:可能不是。我从来没有想过JavaScript继承。@BoltClock:问题是这三种方法在语义和性能上是否都是等价的。
// option 2
function isString(value) {
return (typeof value === 'string') ||
(value.constructor === String);
}
// option 3
function isString(value) {
return (typeof value === 'string') ||
value instanceof String;
}
function isString(value) {
return value.constructor === String;
}
alert(isString("test1")); // true
alert(isString(new String("test2"))); // true