JavaScript'te bir değişkenin dize olup olmadığını kontrol etme

JavaScript'te bir değişkenin string mi yoksa başka bir şey mi olduğunu nasıl belirleyebilirim?

Bende işe yarayan şey bu:

if (typeof myVar === 'string' || myVar instanceof String)
// it's a string
else
// it's something else
Yorumlar (34)
Çözüm

typeof` operatörünü kullanabilirsiniz:

var booleanValue = true; 
var numericalValue = 354;
var stringValue = "This is a String";
var stringObject = new String( "This is a String Object" );
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"
alert(typeof stringObject) // displays "object"

Bu web sayfası]1'den örnek. (Örnek biraz değiştirilmiştir).

Bu, new String() ile oluşturulan dizgiler durumunda beklendiği gibi çalışmaz, ancak bu nadiren kullanılır ve[1][2]'a karşı önerilir. Arzu ederseniz, bunların nasıl ele alınacağını öğrenmek için diğer yanıtlara bakın.


  1. Google JavaScript Stil Kılavuzu ilkel nesne sarmalayıcılarının asla kullanılmaması gerektiğini söyler.
  2. Douglas Crockford ilkel nesne sarmalayıcılarının kullanımdan kaldırılmasını önerir.
Yorumlar (11)

En iyi yol:

var s = 'String';
var a = [1,2,3];
var o = {key: 'val'};

(s.constructor === String) && console.log('its a string');
(a.constructor === Array) && console.log('its an array');
(o.constructor === Object) && console.log('its an object');
(o.constructor === Number || s.constructor === Boolean) && console.log('this won\'t run');

Bunların her biri, "new Object()" vb. gibi uygun sınıf işlevi tarafından oluşturulmuştur.

Ayrıca, Duck-Typing: "Ördeğe benziyorsa, ördek gibi yürüyorsa ve ördek gibi kokuyorsa - bir Dizi olmalıdır" Yani, özelliklerini kontrol edin.

Umarım bu yardımcı olur.

Düzenleme; 12/05/2016

Unutmayın, her zaman farklı yaklaşımların kombinasyonlarını da kullanabilirsiniz. İşte typeof ile eylemlerin çizgi içi haritasını kullanmanın bir örneği:

var type = { 'number': Math.sqrt.bind(Math), ... }[ typeof datum ];

İşte satır içi haritaların kullanımına ilişkin daha 'gerçek bir dünya' örneği:

function is(datum) {
    var isnt = !{ null: true, undefined: true, '': true, false: false, 0: false }[ datum ];
    return !isnt;
}
console.log( is(0), is(false), is(undefined), ... );  // >> true true false

Bu fonksiyon bir değişkenin gerçekten var olup olmadığını anlamak için [ custom ] "type-casting" -- daha ziyade "type-/-value-mapping" -- kullanacaktır. Artık o iğrenç saçları null & 0 arasında ayırabilirsiniz!

Çoğu zaman tipi umurunuzda bile olmaz. Tiplemeyi atlatmanın bir başka yolu da Duck-Type setlerini birleştirmektir:

this.id = "998";  // use a number or a string-equivalent
function get(id) {
    if (!id || !id.toString) return;
    if (id.toString() === this.id.toString()) http( id || +this.id );
    // if (+id === +this.id) ...;
}

Hem Number.prototype hem de String.prototypebir.toString() yöntemine sahiptir. Siz sadece sayının string eşdeğerinin aynı olduğundan emin oldunuz ve ardından bunu http fonksiyonuna bir Number olarak aktardığınızdan emin oldunuz. Başka bir deyişle, türünün ne olduğunu önemsemedik bile.

Umarım bu size çalışacak daha fazla şey verir :)

Yorumlar (5)