Якщо я оголошу логічну змінну 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стане числом. Подальші призначення можуть змінити тип змінної пізніше.