JavaScript'te bir var değişkeninin dize olup olmadığını nasıl kontrol edebilirim?


Yanıtlar:


381

Yakınız:

if (typeof a_string === 'string') {
    // this is a string
}

İlgili bir notta: new String('hello')tür olarak bir dize oluşturulursa yukarıdaki kontrol çalışmaz Object. Bu sorunu çözmek için karmaşık çözümler vardır, ancak dizeleri bu şekilde oluşturmaktan kaçınmak daha iyidir.


1
Millet, ikinize de gerçekten kabul edilmiş bir cevap verirdim, ama yapamam, yapabileceğim tek şey, özel sorunuma daha yakın olan kabul edilen cevabı vermek yerine, her ikisine de +1 tamamen açıkladı.
vitto

Bu benim için çalıştıif(typeof(str) === typeof(String()))
Scott Murphy

78

typeofOperatör bir infix (böylece örnek LHS mantıklı değil) değil.

Bu şekilde kullanmanız gerekiyor ...

if (typeof a_string == 'string') {
    // This is a string.
}

Unutmayın, typeofbir işleç değil, bir işleçtir. Buna rağmen typeof(var), vahşi doğada çok kullanıldığını göreceksiniz . Bu kadar mantıklı var a = 4 + (1).

Ayrıca, ==her iki işlenen de Strings ( typeof her zaman döndürür a String) olduğu için (eşitlik karşılaştırma operatörü) de kullanabilirsiniz , JavaScript kullandığım aynı adımları ===(katı karşılaştırma operatörü) gerçekleştirmek için tanımlanır .

As BOX9 bahseder , bu algılamaz bir örneği Stringnesne.

Bunun için tespit edebilirsiniz ....

var isString = str instanceof String;

jsFiddle .

...veya...

var isString = str.constructor == String;

jsFiddle .

Ancak bu çoklu bir windowortamda çalışmaz (sanırım iframe).

Bu sorunla ...

var isString = Object.prototype.toString.call(str) == '[object String]';

jsFiddle .

Ama yine de, ( Box9'dan bahsedildiği gibi ), sadece değişmez Stringformatı kullanmaktan daha iyidir , örn var str = 'I am a string';.

İleri Okuma .


1
@ Box9 Endişelenme, yine de kapaklıyım: P
alex

@alex Ben de: o (10 dakika daha!)
David Tang

3
@RobG Rep, 24 saatlik bir süre boyunca maksimum temsilciyi kazandığınız zamandır. Bundan sonra, upvotes itibarınıza sayılmaz.
alex

Yalnızca dizelerin sahip olduğu bir üyenin varlığını test ederek bir değişkenin dize olup olmadığını kontrol etmek mümkün değil mi? Örneğin: if(myVar.toUpperCase) alert('I am a string');? Bkz: jsfiddle.net/tb3t4nsx
ingredient_15939

1
@ material_15939 gerçekten iyi bir yol değil ... çünkü{ toUpperCase: '' }
alex

14

Önceki cevapları birleştirmek şu çözümleri sağlar:

if (typeof str == 'string' || str instanceof String)

veya

Object.prototype.toString.call(str) == '[object String]'

4

Aşağıdaki ifade true değerini döndürür :

'qwe'.constructor === String

Aşağıdaki ifade true değerini döndürür :

typeof 'qwe' === 'string'

Aşağıdaki ifade false (sic!) Döndürür:

typeof new String('qwe') === 'string'

Aşağıdaki ifade true değerini döndürür :

typeof new String('qwe').valueOf() === 'string'

En iyi ve doğru yol ( imho ):

if (someVariable.constructor === String) {
   ...
}

1

Şimdi gün inanıyorum typeof () bir işlev formu kullanmak tercih ...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}

hiçbir işlev formu yoktur typeof, sadece bu parantezlerle işlem sırasını kontrol edersiniz. Bazı insanlar bazı durumlarda daha okunabilir bulabilir.
Jon z

@Jonz "İşlem sırasını kontrol etmek" ile ne demek istediniz? Teşekkürler.
a20

Sanırım daha sonra yapıcıyı kontrol edebileceğinizi ve teoride daha hızlı olacağını düşündüğüm için tercih edebileceğinizi fark ettim ama daha hızlı değil mi? Örnek sayı 4 burada parantez kullanım geliştiricisini göstermektedir . 'Sipariş' benim tahmin muhtemelen bir hız sorunu veya derleyici bağımsız değişken yığını yükler ile ilgili, emin değilim.
Usta James

1
@ a20 işlem sırası, birden çok işlem içeren ifadeler için işlemlerin yürütülme sırasını açıklar. Bkz. Developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/… - parantezler (İşletim gruplaması) en yüksek operatör önceliğine sahiptir ve bu nedenle önce değerlendirilir. Bu durumda, parantezler filenameyalnızca tek bir ifadeyi gruplandırır ve bu nedenle işe yaramaz ve yabancıdır. Bu cevabın puanı 0 olması iyi bir şey çünkü yanlış, yanıltıcı ve yararsızdır; olumsuz bir skoru olsaydı daha iyi olurdu.
Jon z

Bağlantı için çok bilgilendirici teşekkürler. Yani önce parantezler kontrol edilir ve çalıştırılır? bu, sonraki adım parantez olmadan aka çağırmanın diğer yollarını kontrol etmeden hemen çalışmalıdır, bu daha sonra ve daha yavaş adımlar olacaktır? Hayır? orada çalışma zamanı derleyici hakkında ne anlamıyorum.
Usta James

0

her durumda null veya undefined olup olmadığını kontrol et a_string

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}

typeof nullve typeof undefinedasla geri dönmeyecek 'string', bu yüzden typeof a_stringyeter. Necroposting için özür dilerim
Ivan Frolov

-3

Tüm durumlar için işe yarayan kişisel yaklaşımım, sadece dizeler için mevcut olacak üyelerin varlığını test etmektir.

function isString(x) {
    return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
}

Bkz. Http://jsfiddle.net/x75uy0o6/

Bu yöntemin kusurları olup olmadığını bilmek istiyorum, ama bana yıllarca iyi hizmet etti.


2
Bu, bu yöntemlere sahip herhangi bir eski nesne tarafından kolayca kandırılır.
alex

8
Buna ördek yazma denir - örneğin, bir dize gibi yürürse ve bir dize gibi konuşuyorsa, bir dize de olabilir. Bunun bir dizeyi test etmenin en iyi yolu olduğunu düşünüyorsanız biraz çılgınsınız, ancak Javascript bir Thunderdome, siz yapıyorsunuz.
Jon z
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.