Sadece var kullanarak JavaScript'te bir boole bildirmek


89

Bunun gibi bir JavaScript boole değişkeni bildirirsem:

var IsLoggedIn;

Ve sonra trueveya ile başlat 1, bu güvenli mi? Yoksa onu 1değişkeni bir sayı ile başlatmak mı?


27
Bu gerçekten "güvenli" ile ne demek istediğinize bağlıdır, javascript'te "güvenli" yoktur.
AnthonyWJones

Yanıtlar:


167

Türler, başlatmanıza bağlıdır:

var IsLoggedIn1 = "true"; //string
var IsLoggedIn2 = 1; //integer
var IsLoggedIn3 = true; //bool

Ancak şu örneğe bir bakın:

var IsLoggedIn1 = "true"; //string
IsLoggedIn1 = true; //now your variable is a boolean

Değişkenlerinizin türü, JavaScript'te atanan değere bağlıdır.


1
ya doğrudan boole değişkenini boolean olarak bildirirsem. O herhangi bir performans iyileştirme yapmak olduğunu
murtaza.webdev

20

Hayır güvenli değil. Daha sonra var yapabilirsiniz IsLoggedIn = "Foo";ve JavaScript hata vermez.

Yapmak mümkün

var IsLoggedIn = new Boolean(false);
var IsLoggedIn = new Boolean(true);

Ayrıca boole olmayan değişkeni 'a aktarabilirsiniz new Boolean()ve bu IsLoggedIn'i boolean yapar.

var IsLoggedIn = new Boolean(0); // false
var IsLoggedIn = new Boolean(NaN); // false
var IsLoggedIn = new Boolean("Foo"); // true
var IsLoggedIn = new Boolean(1); // true

6
Yeni Boolean () kullanmayın; IsLoggedIn, tüm bu durumlarda doğru olarak değerlendirilecektir (evet, yeni Boolean (yanlış) doğrudur).
Miles

@Miles: new Boolean (false) is false doğru değil
Oca

5
@jan: if (new Boolean(false)) alert ('wat')See stackoverflow.com/a/8695363
Miles

@Miles Incredible, (new Boolean(false)).toString()) === "false"bağlantı için teşekkürler
Oca

10

Bu çok kullanışlı öğreticinin dediği gibi:

var age = 0;

// bad
var hasAge = new Boolean(age);

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;

muhtemelen gerçek bir açıklama yok. kimse gönderinizde belirleyebileceğiniz bir öğreticiyi taramak istemez
Heimi

7

Eğer istersen IsLoggedIn aşağıdaki gibi başlatmak gerektiğini boolean olarak tedavi edilmesi:

var IsLoggedIn=true;

İle başlatırsanız var IsLoggedIn=1; o zaman bir tamsayı olarak değerlendirilecektir.

Ancak değişken herhangi bir zamanda IsLoggedInfarklı bir veri türüne başvurabilir:

 IsLoggedIn="Hello World";

Bu bir hataya neden olmaz.


5

Sen edebilirsiniz kullanmak ve test kendi 'tanımlanabilirlik' için en az değişkenleri başlatılmamış. Bunun gibi:

var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false

Dahası, pek çok olasılık vardır: tam türlerle ilgilenmiyorsanız, karşılaştırma için '==' operatörünü (veya! [Değişken] / !! [değişken]) kullanın (Douglas Crockford'un "doğru" veya " sahte 'sanırım). Bu durumda, birimselleştirilmiş değişkene true veya 1 veya '1' atanması, sorulduğunda her zaman doğru döndürür. Aksi takdirde [güvenli karşılaştırmaya ihtiyacınız varsa] karşılaştırma için '===' kullanın.

var thisMayBeTrue;

thisMayBeTrue = 1;
alert(thisMayBeTrue == true); //=> true
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false

thisMayBeTrue = '1';
alert(thisMayBeTrue == true); //=> true 
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false
// so, in this case, using == or !! '1' is implicitly 
// converted to 1 and 1 is implicitly converted to true)

thisMayBeTrue = true;
alert(thisMayBeTrue == true); //=> true
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> true

thisMayBeTrue = 'true';
alert(thisMayBeTrue == true); //=> false
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false
// so, here's no implicit conversion of the string 'true'
// it's also a demonstration of the fact that the 
// ! or !! operator tests the 'definedness' of a variable.

Not: Var olmayan değişkenler için 'tanımlılığı' test edemezsiniz. Yani:

alert(!!HelloWorld);

bir referans hatası verir ('HelloWorld tanımlı değil')

('tanımlılık' için daha iyi bir kelime var mı? Yine de Hollandacamı affedin; ~)


Dize durumlarınızı boş bir dizeyle yeniden denemek isteyebilirsiniz thisMayBeTrue = '';- boş bir dize yanlış olduğu için aynı sonuçları alamazsınız. "Not: Eğer test edemeyeceğiniz olsa değişkenleri varolmayan için 'tanımlanabilirlik'" - Elbette yapabilirsin: typeof HellowWorld === 'undefined'.
nnnnnn

2

Javascript'teki değişkenlerin bir türü yoktur. Sıfır olmayan, boş olmayan, boş olmayan ve true"doğru". Sıfır, boş, tanımsız, boş dizge ve false"yanlış" dır.

Gerçi, değişmez değerler gibi bir Boolean türü vardır trueve false.


JS değişkenlerinin , yalnızca tamsayıları veya dizeleri tutan bir değişkeni tanımlayamayacağınız anlamında bir türü yoktur (diğer bazı dillerde olduğu gibi), ancak değişken tarafından herhangi bir zamanda tutulan belirli değer her zaman bir tür. Ve tür, 2 + 2vs gibi basit bir örnekle gösterilebileceği gibi önemlidir "2" + 2. Ayrıca typeofoperatöre bakın .
nnnnnn

2

Bunun gibi bir şeye ne dersiniz:

var MyNamespace = {
    convertToBoolean: function (value) {
        //VALIDATE INPUT
        if (typeof value === 'undefined' || value === null) return false;

        //DETERMINE BOOLEAN VALUE FROM STRING
        if (typeof value === 'string') {
            switch (value.toLowerCase()) {
                case 'true':
                case 'yes':
                case '1':
                    return true;
                case 'false':
                case 'no':
                case '0':
                    return false;
            }
        }

        //RETURN DEFAULT HANDLER
        return Boolean(value);
    }
};

O zaman bunu şu şekilde kullanabilirsiniz:

MyNamespace.convertToBoolean('true') //true
MyNamespace.convertToBoolean('no') //false
MyNamespace.convertToBoolean('1') //true
MyNamespace.convertToBoolean(0) //false

Bunu performans açısından test etmedim, ancak türden türe dönüştürme çok sık olmamalı, aksi takdirde uygulamanızı kararsızlığa büyük zaman açarsınız!


2
Neden olumsuz oy? Lütfen açıklayın ki hepimiz faydalanabilelim.
TruMan1

1

Değişken, ne tür atarsanız atayın. Başlangıçta öyle undefined. Eğer atarsanız 'true'bir dizge, atarsanız trueboole, atarsanız 1sayı olur. Sonraki atamalar daha sonra değişkenin türünü değiştirebilir.

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.