Якщо я оголошу логічну змінну JavaScript наступним чином:
var IsLoggedIn;
А потім ініціалізуйте його будь-яким true
або 1
, чи це безпечно? Або ініціалізація з допомогою 1
зробить змінну числом?
Якщо я оголошу логічну змінну JavaScript наступним чином:
var IsLoggedIn;
А потім ініціалізуйте його будь-яким true
або 1
, чи це безпечно? Або ініціалізація з допомогою 1
зробить змінну числом?
Відповіді:
Типи залежать від вашої ініціалізації:
var IsLoggedIn1 = "true"; //string
var IsLoggedIn2 = 1; //integer
var IsLoggedIn3 = true; //bool
Але погляньте на цей приклад:
var IsLoggedIn1 = "true"; //string
IsLoggedIn1 = true; //now your variable is a boolean
Тип ваших змінних залежить від призначеного значення в JavaScript.
Ні, це не безпечно. Пізніше ви можете зробити var, IsLoggedIn = "Foo";
і JavaScript не видасть помилки.
Це можливо зробити
var IsLoggedIn = new Boolean(false);
var IsLoggedIn = new Boolean(true);
Ви також можете передати new Boolean()
небулеву змінну в і вона зробить IsLoggedIn булевою.
var IsLoggedIn = new Boolean(0); // false
var IsLoggedIn = new Boolean(NaN); // false
var IsLoggedIn = new Boolean("Foo"); // true
var IsLoggedIn = new Boolean(1); // true
if (new Boolean(false)) alert ('wat')
Див stackoverflow.com/a/8695363
(new Boolean(false)).toString()) === "false"
, спасибі за посилання
Як говорить цей дуже корисний підручник :
var age = 0;
// bad
var hasAge = new Boolean(age);
// good
var hasAge = Boolean(age);
// good
var hasAge = !!age;
Якщо ви хочете, IsLoggedIn
щоб до вас ставились як до логічного значення, вам слід ініціалізуватись наступним чином:
var IsLoggedIn=true;
Якщо ви ініціалізуєте його за допомогою, var IsLoggedIn=1;
тоді це буде розглядатися як ціле число.
Однак у будь-який час змінна IsLoggedIn
може посилатися на інший тип даних:
IsLoggedIn="Hello World";
Це не призведе до помилки.
Ви можете використовувати та перевіряти неініціалізовані змінні, принаймні, на їхню "визначеність". Подобається це:
var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false
Крім того, існує безліч можливостей: якщо вас не цікавлять точні типи, використовуйте оператор '==' (або! [Змінну] / !! [змінну]) для порівняння (це те, що Дуглас Крокфорд називає `` брутним '' або `` помилковий 'я думаю). У цьому випадку присвоєння неіціалізованій змінній true або 1 або '1' завжди повертає true, коли запитується. В іншому випадку [якщо вам потрібне порівняння безпечного типу] для порівняння використовуйте '==='.
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: ви не можете перевірити "визначеність" для неіснуючих змінних. Так:
alert(!!HelloWorld);
дає посилання на помилку ('HelloWorld не визначено')
(чи є краще слово для "визначеності"? Вибачте все-таки мою голландську мову; ~)
thisMayBeTrue = '';
- ви не отримаєте однакових результатів, оскільки порожній рядок хибний. «PS: ви можете не тест" визначеність "для неіснуючих змінних , хоча" - Звичайно , ви можете: typeof HellowWorld === 'undefined'
.
Змінні в Javascript не мають типу. Ненульові, ненульові, непусті та true
є "істинними". Нуль, нуль, невизначений, порожній рядок і false
є "помилковими".
Однак існує булевий тип, як і літерали true
та false
.
2 + 2
проти "2" + 2
. Дивіться також typeof
оператора .
Як щодо чогось такого:
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);
}
};
Тоді ви можете використовувати його так:
MyNamespace.convertToBoolean('true') //true
MyNamespace.convertToBoolean('no') //false
MyNamespace.convertToBoolean('1') //true
MyNamespace.convertToBoolean(0) //false
Я не тестував його на ефективність, але перетворення з типу на тип не повинно відбуватися занадто часто, інакше ви відкриєте свою програму до нестабільності!
Змінна стане таким, яким ти колись її призначиш. Спочатку це так undefined
. Якщо ви призначите його, 'true'
він стане рядком, якщо ви призначите його, true
він стане логічним значенням, якщо ви його призначите, він 1
стане числом. Подальші призначення можуть змінити тип змінної пізніше.