Jeśli zadeklaruję zmienną logiczną JavaScript, taką jak ta:
var IsLoggedIn;
A następnie zainicjuj go za pomocą jednego z nich, true
czy 1
to jest bezpieczne? A może zainicjowanie go za pomocą 1
spowoduje, że zmienna będzie liczbą?
javascript
boolean
mrblah
źródło
źródło
Odpowiedzi:
Typy zależą od Twojej inicjalizacji:
var IsLoggedIn1 = "true"; //string var IsLoggedIn2 = 1; //integer var IsLoggedIn3 = true; //bool
Ale spójrz na ten przykład:
var IsLoggedIn1 = "true"; //string IsLoggedIn1 = true; //now your variable is a boolean
Typ Twoich zmiennych zależy od wartości przypisanej w JavaScript.
źródło
Nie, to nie jest bezpieczne. Możesz później zrobić var,
IsLoggedIn = "Foo";
a JavaScript nie zgłosi błędu.Można to zrobić
var IsLoggedIn = new Boolean(false); var IsLoggedIn = new Boolean(true);
Możesz również przekazać zmienną
new Boolean()
inną niż boolowska do zmiennej, a to sprawi, że IsLoggedIn będzie wartością logiczną.var IsLoggedIn = new Boolean(0); // false var IsLoggedIn = new Boolean(NaN); // false var IsLoggedIn = new Boolean("Foo"); // true var IsLoggedIn = new Boolean(1); // true
źródło
if (new Boolean(false)) alert ('wat')
Zobacz stackoverflow.com/a/8695363(new Boolean(false)).toString()) === "false"
, dzięki za linkJak mówi ten bardzo przydatny samouczek :
var age = 0; // bad var hasAge = new Boolean(age); // good var hasAge = Boolean(age); // good var hasAge = !!age;
źródło
Jeśli chcesz
IsLoggedIn
być traktowany jako boolean, powinieneś zainicjować w następujący sposób:var IsLoggedIn=true;
Jeśli zainicjujesz go z
var IsLoggedIn=1;
, będzie traktowany jako liczba całkowita.Jednak w dowolnym momencie zmienna
IsLoggedIn
może odnosić się do innego typu danych:IsLoggedIn="Hello World";
Nie spowoduje to błędu.
źródło
Państwo może używać i testy niezainicjowanymi zmienne przynajmniej dla ich „definedness”. Lubię to:
var iAmNotDefined; alert(!iAmNotDefined); //true //or alert(!!iAmNotDefined); //false
Ponadto istnieje wiele możliwości: jeśli nie jesteś zainteresowany dokładnymi typami, użyj operatora '==' (lub! [Zmienna] / !! [zmienna]) do porównania (tak Douglas Crockford nazywa „prawda” lub „ fałszywe '' chyba). W takim przypadku przypisanie wartości true, 1 lub „1” do zjednoliconej zmiennej zawsze zwraca prawdę, gdy zostaniesz o to poproszony. W przeciwnym razie [jeśli potrzebujesz bezpiecznego porównania typów] użyj '===' dla porównania.
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.
PS: nie można jednak przetestować „zdefiniowania” dla nieistniejących zmiennych. Więc:
podaje błąd odniesienia („HelloWorld nie jest zdefiniowany”)
(czy jest lepsze słowo na określenie `` definiowalności ''? Mimo wszystko przepraszam za mój holenderski; ~)
źródło
thisMayBeTrue = '';
- nie uzyskasz takich samych wyników, ponieważ pusty ciąg jest fałszywy. „PS: nie można test«definedness»dla nieistniejącego zmienne chociaż” - na pewno można:typeof HellowWorld === 'undefined'
.Zmienne w JavaScript nie mają typu. Niezerowe, niezerowe, niepuste i
true
„prawdziwe”. Zero, null, undefined, pusty ciąg ifalse
mają wartość „false”.Istnieje jednak typ Boolean, podobnie jak dosłowne
true
ifalse
.źródło
2 + 2
vs"2" + 2
. Zobacz takżetypeof
operator .Co powiesz na coś takiego:
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); } };
Następnie możesz go użyć w ten sposób:
MyNamespace.convertToBoolean('true') //true MyNamespace.convertToBoolean('no') //false MyNamespace.convertToBoolean('1') //true MyNamespace.convertToBoolean(0) //false
Nie testowałem tego pod kątem wydajności, ale konwersja z typu na typ nie powinna zdarzać się zbyt często, w przeciwnym razie otworzysz aplikację na dużą niestabilność!
źródło
Zmienna stanie się tym, czym kiedykolwiek ją przypiszesz. Na początku tak jest
undefined
. Jeśli go przypiszesz,'true'
stanie się łańcuchem, jeśli go przypiszesztrue
, stanie się wartością logiczną, jeśli go przypiszesz1
, stanie się liczbą. Kolejne przypisania mogą później zmienić typ zmiennej.źródło