2011-02-03 16 views
13

Jak wykryć, czy zmienna jest ciągiem?jak wykryć, czy zmienna jest ciągiem znaków

+0

Możesz użyć underscore.js, ma metody dla tego wbudowanego http: //documentcloud.github.com/underscore/# isString - w przypadku isString używa metody wymienionej przez user113716 –

+0

możliwy duplikat [Sprawdź, czy zmienna jest ciągiem znaków] (http://stackoverflow.com/questions/4059147/check-ifa-a- variable-is-a-string) – pkyeck

+0

możliwy duplikat [Sprawdź, czy zmienną jest liczba lub ciąg znaków w javascript] (http://stackoverflow.com/questions/1303646/check-whether-variable-is-number- or-tring- in-javascript) – Flimzy

Odpowiedz

30

Jest to sposób określony w specyfikacji ECMAScript w celu określenia wewnętrznej właściwości [[Klasa]].

if(Object.prototype.toString.call(myvar) == '[object String]') { 
    // a string 
} 

From 8.6.2 Object Internal Properties and Methods:

wartość w [[Klasa]] wewnętrzną właściwość określa się w niniejszym opisie dla każdego rodzaju wbudowane w przedmiot. Wartość właściwości wewnętrznej [[Class]] obiektu hosta może być dowolną wartością ciągu, z wyjątkiem jednego z "Argumenty", "Array", "Boolean", "Date", "Error", "Function", "JSON "," Math "," Number "," Object "," RegExp ", i " String ". Wartość właściwości wewnętrznej [[Class]] jest używana wewnętrznie do rozróżniania różnych rodzajów obiektów. Zauważ, że ta specyfikacja nie zapewnia żadnych środków dla programu, aby uzyskać dostęp do tej wartości, z wyjątkiem poprzez Object.prototype.toString (patrz 15.2.4.2).


Na przykład, jak to jest przydatne, należy rozważyć następujący przykład:

var str = new String('some string'); 

alert(typeof str); // "object" 

alert(Object.prototype.toString.call(str)); // "[object String]" 

Jeśli używasz typeof, można dostać "object".

Ale jeśli użyjesz powyższej metody, otrzymasz poprawny wynik "[object String]".

+8

nie wiesz, dlaczego jest to zaakceptowana odpowiedź. obiekty nie są łańcuchami. 'new String()' powoduje, że obiekt zawiera szereg indeksowanych właściwości, z których każda ma wartość odpowiadającą znakowi w tej pozycji. Tak, zostanie przekształcone w ciąg znaków za pomocą metody 'to' ciągnięcia' obiektu, ale faktem jest, że 'nowy ciąg ('jakiś ciąg')' nie jest łańcuchem sam w sobie. 'typeof someString ===" string "' jest poprawnym sposobem określenia, czy zmienna jest łańcuchem. To, czy zmienna może być * przekształcona w * ciąg, jest dyskusyjne; każdy obiekt, który może wyśledzić swój prototypowy łańcuch do 'Object' ma' toString' – jackwanders

16

Możesz użyć do tego celu typeof, ale w wielu przypadkach jest to zły projekt.

if (typeof myVar == "string") { 
    alert("I'm a string!"); 
} 
+5

Co to jest dobry projekt? – Webnet

+0

Zależy od tego, co próbujesz zrobić. Zazwyczaj powinieneś wiedzieć, jaki typ odbierasz lub nie powinno to mieć znaczenia (tzn. Będziesz robić to samo, niezależnie od typu). –

+0

jak korzystać z isNaN()? –

0

typeof('yourstring');// returns string

4

Użyj typeof.

if (typeof foo == 'string') 
+19

Prawdopodobnie jaśniejszy nie używać słów kluczowych jako zmiennych w przykładach. – crdx

0

Stosować alert(typeof "hello"); alert(typeof 123);

Ref .: here.

3
var str = new String("some string"); 
if(str.constructor.name === "String") 
    { 
     alert("I'm a string!"); 
     } 

lub po prostu:

if(str.constructor === String) 
    { 
     alert("I'm a string!"); 
     } 
2

Nie sądzę, musimy traktować new String('some string') jako ciąg, bo jeśli spróbujemy:

new String('abc')==='abc' 

To będzie return false!

Ale jeśli spróbujemy:

String('abc')==='abc' 

To zwróci true.

0
('str'.constructor === String) && alert('its a string!'); 
Powiązane problemy