Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查变量的类型_Javascript - Fatal编程技术网

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