Mendeklarasikan boolean dalam JavaScript hanya menggunakan var

89

Jika saya mendeklarasikan variabel boolean JavaScript seperti ini:

var IsLoggedIn;

Dan kemudian menginisialisasi dengan salah satu trueatau 1, apakah itu aman? Atau akan menginisialisasi dengan 1membuat variabel menjadi angka?

mrblah
sumber
27
Itu benar-benar tergantung pada apa yang Anda maksud dengan "aman", tidak ada "aman" di javascript.
AnthonyWJones

Jawaban:

165

Jenis bergantung pada inisialisasi Anda:

var IsLoggedIn1 = "true"; //string
var IsLoggedIn2 = 1; //integer
var IsLoggedIn3 = true; //bool

Tapi lihat contoh ini:

var IsLoggedIn1 = "true"; //string
IsLoggedIn1 = true; //now your variable is a boolean

Jenis variabel Anda bergantung pada nilai yang ditetapkan di JavaScript.

Canavar
sumber
1
bagaimana jika saya langsung mendeklarasikan variabel boolean sebagai boolean. adalah yang membuat
peningkatan
20

Tidak, itu tidak aman. Anda nanti bisa melakukan var IsLoggedIn = "Foo";dan JavaScript tidak akan membuat kesalahan.

Itu mungkin untuk dilakukan

var IsLoggedIn = new Boolean(false);
var IsLoggedIn = new Boolean(true);

Anda juga dapat meneruskan variabel non boolean ke dalam new Boolean()dan itu akan membuat IsLoggedIn boolean.

var IsLoggedIn = new Boolean(0); // false
var IsLoggedIn = new Boolean(NaN); // false
var IsLoggedIn = new Boolean("Foo"); // true
var IsLoggedIn = new Boolean(1); // true
Ólafur Waage
sumber
6
Jangan gunakan Boolean baru (); IsLoggedIn akan mengevaluasi ke benar dalam semua situasi tersebut (ya, Boolean baru (salah) adalah benar).
Miles
@ Miles: Boolean baru (salah) salah tidak benar
Januari
5
@jan: if (new Boolean(false)) alert ('wat')Lihat stackoverflow.com/a/8695363
Miles
@Miles Incredible, karena (new Boolean(false)).toString()) === "false", terima kasih untuk tautannya
Januari
10

Seperti yang dikatakan tutorial yang sangat berguna ini :

var age = 0;

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

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;
pavv
sumber
mungkin tidak ada penjelasan yang nyata. tidak ada yang ingin menyisir tutorial yang bisa Anda tentukan di tl; dr di pos Anda
Heimi
7

Jika Anda ingin IsLoggedIndiperlakukan sebagai boolean, Anda harus menginisialisasi sebagai berikut:

var IsLoggedIn=true;

Jika Anda menginisialisasi dengan var IsLoggedIn=1;maka itu akan diperlakukan sebagai bilangan bulat.

Namun, setiap saat variabel IsLoggedIndapat merujuk ke tipe data yang berbeda:

 IsLoggedIn="Hello World";

Ini tidak akan menyebabkan kesalahan.

zpesk
sumber
5

Anda dapat menggunakan dan menguji variabel yang tidak diinisialisasi setidaknya untuk 'ketetapannya'. Seperti ini:

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

Selain itu, ada banyak kemungkinan: jika Anda tidak tertarik dengan tipe yang tepat, gunakan operator '==' (atau! [Variabel] / !! [variabel]) untuk perbandingan (itulah yang disebut Douglas Crockford 'truthy' atau ' salah 'saya pikir). Dalam hal ini, menugaskan benar atau 1 atau '1' ke variabel unitial selalu mengembalikan nilai benar ketika ditanya. Sebaliknya [jika Anda membutuhkan jenis perbandingan yang aman] gunakan '===' untuk perbandingan.

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: Anda tidak dapat menguji 'ketetapan' untuk variabel yang tidak ada. Begitu:

alert(!!HelloWorld);

memberikan referensi Kesalahan ('HelloWorld tidak ditentukan')

(apakah ada kata yang lebih baik untuk 'ketegasan'? Maafkan bahasa Belanda saya; ~)

KooiInc
sumber
Anda mungkin ingin mencoba kembali kasus string Anda dengan string kosong thisMayBeTrue = '';- Anda tidak akan mendapatkan hasil yang sama karena string kosong salah. "PS: Anda tidak bisa test 'definedness' untuk nonexisting variabel meskipun" - Tentu Anda dapat: typeof HellowWorld === 'undefined'.
nnnnnn
2

Variabel dalam Javascript tidak memiliki tipe. Bukan nol, bukan nol, tidak kosong dan true"benar". Nol, nol, tidak ditentukan, string kosong dan false"salah".

Ada tipe Boolean, seperti literal truedan false.

Eugene Morozov
sumber
JS variabel tidak memiliki tipe dalam arti bahwa Anda tidak dapat mendeklarasikan variabel yang hanya akan terus integer atau string (seperti yang terjadi di beberapa bahasa lain), tetapi khususnya nilai yang dipegang oleh variabel pada waktu tertentu akan selalu memiliki sebuah tipe. Dan jenis penting seperti dapat ditunjukkan dengan contoh sederhana seperti 2 + 2vs "2" + 2. Lihat juga typeofoperatornya .
nnnnnn
2

Bagaimana dengan sesuatu yang seperti ini:

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);
    }
};

Kemudian Anda bisa menggunakannya seperti ini:

MyNamespace.convertToBoolean('true') //true
MyNamespace.convertToBoolean('no') //false
MyNamespace.convertToBoolean('1') //true
MyNamespace.convertToBoolean(0) //false

Saya belum mengujinya untuk kinerja, tetapi mengonversi dari tipe ke tipe tidak boleh terjadi terlalu sering jika tidak Anda membuka aplikasi Anda hingga tidak stabil dalam waktu besar!

TruMan1
sumber
2
Mengapa memilih down? Tolong jelaskan agar kita semua bisa mendapatkan keuntungan.
TruMan1
1

Variabel akan menjadi tipe apa pun yang Anda tetapkan. Awalnya memang begitu undefined. Jika Anda menetapkannya 'true'akan menjadi string, jika Anda menetapkannya trueakan menjadi boolean, jika Anda menetapkannya 1akan menjadi angka. Penugasan selanjutnya mungkin mengubah jenis variabel nanti.

AnthonyWJones
sumber