varだけを使用してJavaScriptでブール値を宣言する


89

次のようにJavaScriptブール変数を宣言すると、

var IsLoggedIn;

そして、trueまたは1で初期化します、それは安全ですか?または1、変数を数値にして初期化しますか?


27
それは本当にあなたが「安全」とは何を意味するかに依存し、JavaScriptには「安全」はありません。
AnthonyWJones 2009年

回答:


164

タイプは初期化に依存します:

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で割り当てられた値によって異なります。


1
ブール変数をブールとして直接宣言するとどうなりますか?それはパフォーマンスを向上させることです
murtaza.webdev '10

20

いいえ、それは安全ではありません。後で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

6
new Boolean();を使用しないでください。IsLoggedInは、これらすべての状況でtrueと評価されます(はい、new Boolean(false)はtrueです)。
マイル

@Miles:new Boolean(false)is false not true
jan

5
@jan:if (new Boolean(false)) alert ('wat')stackoverflow.com/a/8695363
Miles

@Miles Incredible、(new Boolean(false)).toString()) === "false"リンク、ありがとう
jan

10

この非常に便利なチュートリアルでは、

var age = 0;

// bad
var hasAge = new Boolean(age);

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;

おそらく本当の説明はありません。投稿のtl; drで指定できるチュートリアルをくまなく見たくない
Heimi

7

IsLoggedInブール値として扱いたい場合は、次のように初期化する必要があります。

var IsLoggedIn=true;

で初期化するとvar IsLoggedIn=1;、整数として扱われます。

ただし、変数IsLoggedInはいつでも別のデータ型を参照できます。

 IsLoggedIn="Hello World";

これはエラーの原因にはなりません。


5

初期化されていない変数を使用して、少なくとも「定義済み」であることをテストできます。このような:

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'
nnnnnn 2012

2

Javascriptの変数には型がありません。非ゼロ、非ヌル、非空、およびtrueはなく、「真」です。ゼロ、null、未定義、空の文字列、false、「false」です。

ただし、リテラルtrueおよびと同様に、ブール型がありfalseます。


JS 変数には、整数または文字列のみを保持する変数を宣言できないという意味でタイプはありません(他の一部の言語で発生するように)が、常にその変数が保持する特定のは常にタイプ。そして、2 + 2vsのような簡単な例で示すことができるように、タイプは重要"2" + 2です。typeof演算子も参照してください。
nnnnnn 2012

2

このようなものはどうですか:

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

パフォーマンスについてはテストしていませんが、型から型への変換はそれほど頻繁に行われるべきではありません。


2
なぜ反対票か。私たち全員が利益を得られるように説明してください。
TruMan1

1

変数は、割り当てた型になります。最初はundefinedです。割り当てると'true'文字列になり、割り当てるとtrueブール型になり、割り当てると1数値になります。後続の割り当てにより、変数のタイプが後で変更される場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.