Если я объявлю логическую переменную 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
он станет числом. Последующие присвоения могут позже изменить тип переменной.