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

我正在关注一个教程,该教程建议检查一个对象是否是字符串而不是空的,如下所示:

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

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

我试图用其他可用的方法( typeofinstanceof )来测试它,使用一些SO问题,在这里和这里也是如此!

所以我决定在Js Bin中测试它:jsbin代码如下:

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-为什么instanceof检查失败?


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

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

本教程假定[只]字符串对象 - 或者被提升的字符串值 - 具有charAt方法,因此使用“鸭子键入”。 如果方法确实存在,则调用它。 如果charAt超出界限,则返回一个空字符串“”,这是一个false-y值。

教程代码也会接受一串“ 0”,而s && s.length不会 - 但它也可以在数组(或jQuery对象等)上“工作”。 就我个人而言,我相信调用者提供允许的值/类型并尽可能少使用“类型检查”或特殊框架。


1对于字符串,数字和布尔值的原始值,分别存在对应的对象类型String,Number和Boolean。 当对这些基元值之一使用x.property ,效果是ToObject(x).property - 因此是“促销”。 这在ES5:9.9 - ToObject中讨论。

null或未定义的值都没有相应的对象(或方法)。 功能已经对象,但有不同的历史,和有用的, typeof结果。

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


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

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

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

第二行基本相当于:

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

例如:

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

2-为什么检查实例失败?

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

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

然而:

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

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

str instanceof String || typeof str === "string";
链接地址: http://www.djcxy.com/p/94975.html

上一篇: check if an object is string in Javascript

下一篇: how to detect if variable is a string