Объявление логического значения в JavaScript с помощью просто var - PullRequest
87 голосов
/ 17 марта 2009

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

var IsLoggedIn;

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

Ответы [ 8 ]

158 голосов
/ 17 марта 2009

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

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.

20 голосов
/ 17 марта 2009

Нет, это не безопасно. Позже вы можете сделать 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
8 голосов
/ 26 марта 2013

Как этот очень полезный учебник говорит:

var age = 0;

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

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;
7 голосов
/ 17 марта 2009

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

var IsLoggedIn=true;

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

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

 IsLoggedIn="Hello World";

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

5 голосов
/ 17 марта 2009

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

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'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 не определен»)

(есть ли более подходящее слово для «определенности»? Прошу прощения за моего голландца; ~)

2 голосов
/ 20 июня 2012

Как насчет этого:

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 голосов
/ 17 марта 2009

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

Хотя есть логический тип, как и литералы true и false.

1 голос
/ 17 марта 2009

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

...