检查对象是否是Javascript中的字符串

check if an object is string in Javascript

我遵循一个建议检查对象是否为字符串而不是空的教程,如下所示:

1
2
var s ="text here";
if ( s && s.charAt && s.charAt(0))

据说,如果s是字符串,那么它有一个方法charat,然后最后一个组件将检查字符串是否为空。

我试着用其他可用的方法来测试它,比如(typeofinstanceof使用一些so问题,在这里和这里也一样!!

所以我决定在js bin:jsbin代码中测试它,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
var string1 ="text here";
var string2 ="";


alert("string1  is" + typeof string1);
alert("string2  is" + typeof string2);


//part1- this will succeed and show it is string
if(string1 && string1.charAt){
  alert("part1- string1 is string");
}else{
  alert("part1- string1 is not string");
}


//part2- this will show that it is not string
if(string2 && string2.charAt ){
  alert("part2- string2 is string");
}else{
  alert("part2- string2 is not string");
}



//part3 a - this also fails !!
if(string2 instanceof String){  
  alert("part3a- string2 is really a string");
}else{
  alert("part3a- failed instanceof check !!");
}

//part3 b- this also fails !!
//i tested to write the String with small 's' => string
// but then no alert will excute !!
if(string2 instanceof string){  
  alert("part3b- string2 is really a string");
}else{
  alert("part3b- failed instanceof check !!");
}

现在我的问题是:

1-使用string2.charAt检查字符串为空时,为什么字符串检查失败????

2-为什么EDOCX1[1]检查失败??


字符串值不是字符串对象(这就是InstanceOf失败的原因)2。

为了使用"类型检查"覆盖这两种情况,它将是typeof x ==="string" || x instanceof String;第一种情况只匹配字符串,而后一种情况匹配字符串。

本教程假设[只有]字符串对象(或被提升的字符串值1)有一个charAt方法,因此使用"duck-typing"。如果该方法确实存在,则调用它。如果在边界外使用charAt,则返回一个空字符串,该字符串为假y值。

教程代码还接受一个字符串"0",而s && s.length不接受,但它也可以在数组(或jquery对象等)上"工作"。就个人而言,我相信调用者提供允许的值/类型,并尽可能少地使用"类型检查"或特殊的大小写。

1对于string、number和boolean的原语值,分别有一个对应的对象类型string、number和boolean。当x.property用于其中一个原始值时,效果是ToObject(x).property—因此是"提升"。这将在ES5:9.9-ToObject中讨论。

空值或未定义值都没有相应的对象(或方法)。函数已经是对象,但有一个历史上不同的有用的typeof结果。

2有关不同类型的值,请参见ES5:8-类型。字符串类型,例如,表示一个字符串值。


1- Why does the check for string fails when the string is empty using the string2.charAt?

由于第一个条件失败,以下表达式的计算结果为false:

1
2
var string2 ="";
if (string2 && string2.charAt) { console.log("doesn't output"); }

第二行基本上等于:

1
if (false && true) { console.log("doesn't output"); }

例如:

1
2
if (string2) { console.log("this doesn't output since string2 == false"); }
if (string2.charAt) { console.log('this outputs'); }

2- Why does the instanceof check fail?

这失败了,因为在javascript中,字符串可以是文本或对象。例如:

1
2
var myString = new String("asdf");
myString instanceof String; // true

然而:

1
2
var myLiteralString ="asdf";
myLiteralString instanceof String; // false

通过检查类型和instanceof,可以可靠地判断它是否是字符串:

1
str instanceof String || typeof str ==="string";