การประกาศบูลีนใน JavaScript โดยใช้เพียงแค่ var


89

ถ้าฉันประกาศตัวแปรบูลีนของ JavaScript เช่นนี้:

var IsLoggedIn;

แล้วเริ่มต้นด้วยอย่างใดอย่างหนึ่งtrueหรือ1ว่าปลอดภัย? หรือจะเริ่มต้นด้วยการ1ทำให้ตัวแปรเป็นตัวเลข?


27
มันขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "ปลอดภัย" ไม่มี "ปลอดภัย" ในจาวาสคริปต์
AnthonyWJones

คำตอบ:


167

ประเภทขึ้นอยู่กับการเริ่มต้นของคุณ:

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

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
อย่าใช้บูลีนใหม่ (); IsLoggedIn จะประเมินเป็นจริงในทุกสถานการณ์ (ใช่บูลีนใหม่ (เท็จ) เป็นจริง)
ไมล์

@Miles: บูลีนใหม่ (เท็จ) เป็นเท็จไม่จริง
ม.ค.

5
@jan: if (new Boolean(false)) alert ('wat')ดูstackoverflow.com/a/8695363
ไมล์

@Miles Incredible เนื่องจาก(new Boolean(false)).toString()) === "false"ขอบคุณสำหรับลิงก์
ม.ค.

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

นอกจากนี้ยังมีความเป็นไปได้อีกมากมาย: หากคุณไม่สนใจประเภทที่แน่นอนให้ใช้ตัวดำเนินการ '==' (หรือ! [ตัวแปร] / !! [ตัวแปร]) เพื่อเปรียบเทียบ (นั่นคือสิ่งที่ดักลาสคร็อกฟอร์ดเรียกว่า 'truthy' หรือ ' เป็นเท็จ 'ฉันคิดว่า) ในกรณีนั้นการกำหนด true หรือ 1 หรือ '1' ให้กับตัวแปร unitialized จะคืนค่า 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: คุณไม่สามารถทดสอบ 'definedness สำหรับ nonexisting ตัวแปรแม้ว่า" - typeof HellowWorld === 'undefined'แน่ใจว่าคุณสามารถ:
nnnnnn

2

ตัวแปรใน Javascript ไม่มีประเภท ไม่ใช่ศูนย์ไม่ใช่โมฆะไม่ว่างเปล่าและtrueเป็น "จริง" สตริงที่falseเป็นศูนย์ว่างเปล่าไม่ได้กำหนดและเป็น "เท็จ"

แม้ว่าจะมีประเภทบูลีนเช่นเดียวกับตัวอักษรtrueและfalse.


ตัวแปร JS ไม่มีประเภทในแง่ที่คุณไม่สามารถประกาศตัวแปรที่จะเก็บเฉพาะจำนวนเต็มหรือสตริง (เช่นเดียวกับที่เกิดขึ้นในภาษาอื่น ๆ ) แต่ค่าเฉพาะที่ถือโดยตัวแปรในช่วงเวลาใดเวลาหนึ่งจะมีเสมอ ประเภท. และประเภทของเรื่องที่สามารถแสดงให้เห็นด้วยตัวอย่างง่ายๆเช่นVS2 + 2 "2" + 2ดูตัวtypeofดำเนินการด้วย
nnnnnn

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.