Объявление логического значения в JavaScript с использованием только var

89

Если я объявлю логическую переменную JavaScript следующим образом:

var IsLoggedIn;

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

мрбла
источник
27
Это действительно зависит от того, что вы подразумеваете под «безопасным», в javascript нет «безопасного».
AnthonyWJones,

Ответы:

165

Типы зависят от вашей инициализации:

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
что, если я прямо объявляю логическую переменную как логическую. Это может
улучшить
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: новый Boolean (ложь) является ложным , не верно
январем
5
@jan: if (new Boolean(false)) alert ('wat')См. stackoverflow.com/a/8695363
Майлз,
@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 в своем сообщении
Heimi
7

Если вы хотите, IsLoggedInчтобы вас рассматривали как логическое, вы должны инициализировать его следующим образом:

var IsLoggedIn=true;

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

Однако в любой момент переменная IsLoggedInможет относиться к другому типу данных:

 IsLoggedIn="Hello World";

Это не вызовет ошибки.

Zpesk
источник
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 не определен')

(есть ли лучшее слово для «определенности»? В любом случае простите меня за нидерландский; ~)

KooiInc
источник
Возможно, 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

Я не тестировал его на производительность, но преобразование из типа в тип не должно происходить слишком часто, иначе вы откроете свое приложение из-за большой нестабильности!

TruMan1
источник
2
Почему голосование против? Пожалуйста, объясните, чтобы мы все получили пользу.
TruMan1
1

Переменная станет тем типом, который вы ей присвоите. Изначально это так undefined. Если вы назначите его, 'true'он станет строкой, если вы назначите его, trueон станет логическим, если вы назначите его, 1он станет числом. Последующие присвоения могут позже изменить тип переменной.

ЭнтониУДжонс
источник