2014-07-19 136 views
3

我下面一個教程,建議檢查的對象是字符串,而不是空的,如下:檢查如果對象是字符串在Javascript

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

有人說,如果s是字符串,那麼它有charAt方法,然後最後一個組件將檢查字符串是否爲空。

我試着用一些SO questionsherehere too !!

有相似(typeofinstanceof)其他可用的方法來測試它,所以我決定測試它的js斌:jsbin code here如下:

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-爲什麼當字符串使用爲空字符串校驗失敗???

2-爲什麼instanceof檢查失敗?

+0

'如果(string2.charAt)'只檢查方法是否定義,空字符串仍然是一個字符串,所以將返回true – charlietfl

+0

@charlietfl plz引用adeneo的答案,他說:「一個簡單的字符串不是一個對象,它是一個主要的數據類型,並且沒有原型,與用新String創建的String對象相反。「 – stackunderflow

+0

所以空字符串定義爲文字不會返回true如果檢查charAt函數的存在 – stackunderflow

回答

8

字符串值字符串對象(這就是爲什麼所述的instanceof失敗)。

要使用「類型檢查」來覆蓋這兩種情況,它將是typeof x === "string" || x instanceof String;第一隻匹配字符串和後者匹配字符串

本教程假設[只]字符串對象 - 或者提升的字符串值具有charAt方法,因此使用"duck-typing"。如果方法確實存在,則調用它。如果使用charAt超出範圍,則返回一個空字符串「」,這是一個false-y值。

教程代碼也會接受一個「\ 0」字符串,而s && s.length不會 - 但它也可以在數組(或jQuery對象等)上「工作」。我個人認爲信任調用者提供允許的值/類型,儘可能少使用「類型檢查」或特殊套管。


對於字符串,數字和布爾的原始值有字符串,數字和布爾的對應對象類型,分別。當在這些原始值之一上使用x.property時,效果爲ToObject(x).property - 因此爲「促銷」。這在ES5: 9.9 - ToObject中討論。

null或未定義的值都沒有相應的對象(或方法)。函數已經是對象,但有一個歷史上不同且有用的結果typeof。對於不同類型的值,請參閱ES5: 8 - Types。字符串類型,例如,表示字符串值。

2

1-爲什麼當字符串爲空時使用string2.charAt檢查字符串失敗?

下面的表達式評估爲假,因爲第一條件失敗:

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-爲什麼instanceof檢查失敗?

這會失敗,因爲在javascript中,字符串可以是文字或對象。例如:

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

但是:

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

您可以可靠地告訴我們,如果它是一個字符串,通過檢查兩個類型和instanceof

str instanceof String || typeof str === "string"; 
+0

你錯過了一些東西,我的問題是沒有把參數設置爲0。實際上沒有括號。'if(str ing1 && string1.charAt){' – stackunderflow

相關問題