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

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

var IsLoggedIn;

И затем инициализируйте его с помощью true или 1, это безопасно? Или инициализировать его с помощью 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.

Ответ 2

Нет, это не безопасно. Вы можете позже выполнить 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

Ответ 3

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

var IsLoggedIn=true;

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

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

 IsLoggedIn="Hello World";

Это не приведет к ошибке.

Ответ 5

Вы можете использовать и тестировать неинициализированные переменные, по крайней мере, для своей "определенности". Вот так:

var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false

Кроме того, есть много возможностей: если вас не интересуют точные типы, используйте оператор '==' (или! [variable]/!! [variable]) для сравнения (это то, что Дуглас Крокфорд называет "правдивым" 'или' ложь ', я думаю). В этом случае присваивание 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 no implicit conversion of the string 'true'
// it also a demonstration of the fact that the 
// ! or !! operator tests the 'definedness' of a variable.

PS: вы не можете проверить "определенность" для несуществующих переменных. Итак:

alert(!!HelloWorld);

дает ссылку Error ( "HelloWorld не определен" )

(есть ли лучшее слово для "определенности"?) Прошу прощения за мой голландский язык;)

Ответ 6

Переменные в Javascript не имеют типа. Ненулевые, непустые, непустые и true являются "истинными". Нуль, null, undefined, пустая строка и false являются "ложными".

Здесь существует булев тип, как и литералы true и false.

Ответ 7

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

Ответ 8

Как насчет чего-то вроде этого:

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

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