質問

次のようなJavaScriptブール変数を宣言する場合:

var IsLoggedIn;

そして、それをtrueまたは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

このように、非常に役立つチュートリアルは次のように述べています。

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="Hello World";

これによりエラーは発生しません。

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

var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false

さらに、多くの可能性があります。正確な型に興味がない場合は、比較のために '=='演算子(または![variable] / !! [variable])を使用します(ダグラスクロックフォードは 'truthyと呼びます) 'または' 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が定義されていません」)

(「定義性」のより良い言葉はありますか?とにかく私のオランダ人を許してください;〜)

Javascriptの変数には型がありません。ゼロ以外、ヌル以外、空でない、およびtrueは<!> quot; true <!> quot;です。ゼロ、ヌル、未定義、空の文字列、およびfalseは<!> quot; false <!> quot;です。

リテラル<=>および<=>と同様、ブール型もあります。

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

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に割り当てると数値になります。後続の割り当てにより、後で変数のタイプが変更される場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top