Если я объявлю логическую переменную JavaScript следующим образом:
var IsLoggedIn;
А затем инициализируйте его с помощью true
или 1
, это безопасно? Или инициализация 1
сделает переменную числом?
javascript
boolean
мрбла
источник
источник
Ответы:
Типы зависят от вашей инициализации:
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: вы не можете проверить «определенность» для несуществующих переменных. Так:
дает ссылку на ошибку ('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
он станет числом. Последующие присвоения могут позже изменить тип переменной.источник