Оголошення логічного значення в JavaScript за допомогою просто var


89

Якщо я оголошу логічну змінну JavaScript наступним чином:

var IsLoggedIn;

А потім ініціалізуйте його будь-яким trueабо 1, чи це безпечно? Або ініціалізація з допомогою 1зробить змінну числом?


27
Це насправді залежить від того, що ви маєте на увазі під словом "безпечний", у "JavaScript" немає "безпечного".
AnthonyWJones

Відповіді:


164

Типи залежать від вашої ініціалізації:

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.


1
що якщо я прямо оголошую логічну змінну як логічну. це те, що робить будь-які покращення виконання
murtaza.webdev

20

Ні, це не безпечно. Пізніше ви можете зробити 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

6
Не використовуйте new Boolean (); IsLoggedIn буде оцінювати як true у всіх цих ситуаціях (так, new Boolean (false) є true).
Майлз

@Miles: new Boolean (false) is false not true
січень

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

@Miles Incredible, а (new Boolean(false)).toString()) === "false", спасибі за посилання
січень

10

Як говорить цей дуже корисний підручник :

var age = 0;

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

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;

мабуть, справжнього пояснення немає. ніхто не хоче розчісувати підручник, який ви могли б вказати в tl; dr in your post
Heimi

7

Якщо ви хочете, IsLoggedInщоб до вас ставились як до логічного значення, вам слід ініціалізуватись наступним чином:

var IsLoggedIn=true;

Якщо ви ініціалізуєте його за допомогою, var IsLoggedIn=1;тоді це буде розглядатися як ціле число.

Однак у будь-який час змінна IsLoggedInможе посилатися на інший тип даних:

 IsLoggedIn="Hello World";

Це не призведе до помилки.


5

Ви можете використовувати та перевіряти неініціалізовані змінні, принаймні, на їхню "визначеність". Подобається це:

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'.
nnnnnn

2

Змінні в Javascript не мають типу. Ненульові, ненульові, непусті та trueє "істинними". Нуль, нуль, невизначений, порожній рядок і falseє "помилковими".

Однак існує булевий тип, як і літерали trueта false.


Змінні JS не мають типу в тому сенсі, що ви не можете оголосити змінну, яка міститиме лише цілі числа або рядки (як це відбувається в деяких інших мовах), але конкретне значення, яке зберігається змінною в будь-який момент часу, завжди матиме тип. І тип має значення , як можна показати на простому прикладі , як 2 + 2проти "2" + 2. Дивіться також typeofоператора .
nnnnnn

2

Як щодо чогось такого:

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

Я не тестував його на ефективність, але перетворення з типу на тип не повинно відбуватися занадто часто, інакше ви відкриєте свою програму до нестабільності!


2
Чому голос проти? Поясніть, будь ласка, щоб ми всі могли отримати вигоду.
TruMan1

1

Змінна стане таким, яким ти колись її призначиш. Спочатку це так undefined. Якщо ви призначите його, 'true'він стане рядком, якщо ви призначите його, trueвін стане логічним значенням, якщо ви його призначите, він 1стане числом. Подальші призначення можуть змінити тип змінної пізніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.