ถ้าฉันประกาศตัวแปรบูลีนของ JavaScript เช่นนี้:
var IsLoggedIn;
แล้วเริ่มต้นด้วยอย่างใดอย่างหนึ่งtrue
หรือ1
ว่าปลอดภัย? หรือจะเริ่มต้นด้วยการ1
ทำให้ตัวแปรเป็นตัวเลข?
ถ้าฉันประกาศตัวแปรบูลีนของ JavaScript เช่นนี้:
var IsLoggedIn;
แล้วเริ่มต้นด้วยอย่างใดอย่างหนึ่งtrue
หรือ1
ว่าปลอดภัย? หรือจะเริ่มต้นด้วยการ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
if (new Boolean(false)) alert ('wat')
ดูstackoverflow.com/a/8695363
(new Boolean(false)).toString()) === "false"
ขอบคุณสำหรับลิงก์
ดังที่บทช่วยสอนที่มีประโยชน์นี้กล่าวว่า:
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
สามารถอ้างถึงประเภทข้อมูลอื่น:
IsLoggedIn="Hello World";
สิ่งนี้จะไม่ทำให้เกิดข้อผิดพลาด
คุณสามารถใช้และทดสอบตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้นเป็นอย่างน้อยสำหรับ 'การกำหนดค่า' แบบนี้:
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'
แน่ใจว่าคุณสามารถ:
ตัวแปรใน Javascript ไม่มีประเภท ไม่ใช่ศูนย์ไม่ใช่โมฆะไม่ว่างเปล่าและtrue
เป็น "จริง" สตริงที่false
เป็นศูนย์ว่างเปล่าไม่ได้กำหนดและเป็น "เท็จ"
แม้ว่าจะมีประเภทบูลีนเช่นเดียวกับตัวอักษรtrue
และfalse
.
2 + 2
"2" + 2
ดูตัวtypeof
ดำเนินการด้วย
เกี่ยวกับสิ่งนี้:
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
มันจะกลายเป็นตัวเลข การกำหนดในภายหลังอาจเปลี่ยนประเภทของตัวแปรในภายหลัง