次のように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;
初期化されていない変数を使用して、少なくとも「定義済み」であることをテストできます。このような:
var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false
さらに、多くの可能性があります。正確な型に興味がない場合は、比較のために「==」演算子(または![変数] / !! [変数])を使用します(これは、ダグラス・クロックフォードが「真実」または「 falsy 'だと思います)。その場合、ユニテリアライズ変数に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
はなく、「真」です。ゼロ、null、未定義、空の文字列、false
、「false」です。
ただし、リテラルtrue
およびと同様に、ブール型がありfalse
ます。
2 + 2
vsのような簡単な例で示すことができるように、タイプは重要"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
数値になります。後続の割り当てにより、変数のタイプが後で変更される場合があります。