Если я объявляю логическую переменную 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
Если вы хотите, чтобы IsLoggedIn
считался логическим, вы должны инициализировать следующим образом:
var IsLoggedIn=true;
Если вы инициализируете его с помощью var IsLoggedIn=1;
, тогда он будет рассматриваться как целое число.
Однако в любое время переменная IsLoggedIn
может ссылаться на другой тип данных:
IsLoggedIn="Hello World";
Это не приведет к ошибке.
Как этот очень полезный учебник говорит:
var age = 0;
// bad
var hasAge = new Boolean(age);
// good
var hasAge = Boolean(age);
// good
var hasAge = !!age;
Вы можете использовать и тестировать неинициализированные переменные, по крайней мере, для своей "определенности". Вот так:
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 не определен" )
(есть ли лучшее слово для "определенности"?) Прошу прощения за мой голландский язык;)
Переменные в Javascript не имеют типа. Ненулевые, непустые, непустые и true
являются "истинными". Нуль, null, undefined, пустая строка и false
являются "ложными".
Здесь существует булев тип, как и литералы true
и false
.
Переменная станет тем типом, который вы назначили ему. Первоначально он undefined
. Если вы назначили его 'true'
, он станет строкой, если вы присвоите ей true
, она станет логической, если вы ее назначите 1
, она станет числом. Последующие присваивания могут позже изменить тип переменной.
Как насчет чего-то вроде этого:
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
Я не тестировал его для производительности, но преобразование из типа в тип не должно происходить слишком часто, иначе вы быстро откроете приложение до нестабильности!