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