94

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

var IsLoggedIn;

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

4

8 に答える 8

173

型は初期化に依存します:

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

于 2009-03-17T12:03:02.883 に答える
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
于 2009-03-17T12:00:30.393 に答える
10

この非常に便利なチュートリアルが言うように:

var age = 0;

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

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;
于 2013-03-26T13:35:49.393 に答える
7

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

var IsLoggedIn=true;

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

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

 IsLoggedIn="Hello World";

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

于 2009-03-17T12:01:57.317 に答える
5

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

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

さらに、多くの可能性があります: 正確な型に興味がない場合は、比較のために「==」演算子 (または ![変数] / !![変数]) を使用します (これは、Douglas Crockford が「真実」または「偽物だと思います)。その場合、初期化された変数に 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 は定義されていません」)

(「明確さ」を表すより適切な言葉はありますか?とにかく私のオランダ人を許してください;~)

于 2009-03-17T13:06:31.453 に答える
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

パフォーマンスについてはテストしていませんが、型から型への変換はあまり頻繁に行わないでください。そうしないと、アプリが不安定になる可能性があります。

于 2012-06-20T15:23:36.377 に答える
2

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

ただし、リテラルtruefalse.

于 2009-03-17T12:06:12.813 に答える
1

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

于 2009-03-17T12:05:43.347 に答える