คำตอบมากมายที่ทำครึ่งหนึ่งของงาน ใช่!!X
สามารถอ่านได้ว่า "ความจริงของ X [แสดงเป็นบูลีน]" แต่!!
ไม่ใช่การพูดจริงดังนั้นสำคัญสำหรับการหาว่าตัวแปรเดียวคือ (หรือแม้ว่าตัวแปรหลายตัว) ความจริงหรือเท็จ เป็นเช่นเดียวกับเพียง!!myVar === true
myVar
เมื่อเปรียบเทียบ!!X
กับบูลีน "ของจริง" ไม่มีประโยชน์จริงๆ
สิ่งที่คุณได้รับ!!
คือความสามารถในการตรวจสอบความจริงของตัวแปรหลายตัวต่อกันในรูปแบบที่เป็นมาตรฐาน (และเป็นมิตรกับ JSLint) ที่ทำซ้ำได้
หล่อเพียง :(
นั่นคือ...
0 === false
false
เป็น
!!0 === false
true
เป็น
ข้างต้นไม่ได้มีประโยชน์มาก if (!0)
ให้ผลลัพธ์เหมือนกับif (!!0 === false)
คุณ ฉันไม่สามารถนึกถึงกรณีที่ดีในการคัดเลือกตัวแปรเป็นบูลีนแล้วเปรียบเทียบกับบูลีน "ของจริง"
ดู "== และ! =" จากทิศทางของ JSLint (หมายเหตุ: Crockford กำลังเคลื่อนย้ายเว็บไซต์ของเขาไปรอบ ๆ ; ลิงก์นั้นมีแนวโน้มที่จะตายในบางจุด) เพราะเหตุผลเล็กน้อย:
ตัวดำเนินการ == และ! = จะพิมพ์ข้อความบังคับก่อนเปรียบเทียบ สิ่งนี้ไม่ดีเพราะทำให้ '\ t \ r \ n' == 0 เป็นจริง นี่สามารถปกปิดข้อผิดพลาดประเภท JSLint ไม่สามารถระบุได้อย่างน่าเชื่อถือว่า == มีการใช้อย่างถูกต้องหรือไม่ดังนั้นจึงเป็นการดีที่สุดที่จะไม่ใช้ == และ! = เลยและใช้ตัวดำเนินการ === และ! == ที่เชื่อถือได้มากกว่าเสมอ
หากคุณสนใจว่าคุณค่านั้นเป็นความจริงหรือเป็นเท็จให้ใช้แบบฟอร์มสั้น ๆ แทน
(foo != 0)
เพียงแค่พูดว่า
(foo)
และแทนที่จะ
(foo == 0)
พูด
(!foo)
โปรดทราบว่ามีบางกรณีที่ไม่ได้ใช้งานง่ายซึ่งบูลีนจะถูกส่งไปยังหมายเลข ( true
ถูกส่งไปยัง1
และfalse
ไปที่0
) เมื่อเปรียบเทียบบูลีนกับตัวเลข ในกรณีนี้!!
อาจมีประโยชน์ทางจิตใจ แม้ว่าจะเป็นกรณีที่คุณเปรียบเทียบบูลีนที่ไม่ได้เป็นบูลีนที่พิมพ์ยากซึ่งก็คือ IMO ข้อผิดพลาดร้ายแรง if (-1)
ยังคงเป็นวิธีที่จะไปที่นี่
╔═══════════════════════════════════════╦═══════════════════╦═══════════╗
║ Original ║ Equivalent ║ Result ║
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (-1 == true) console.log("spam") ║ if (-1 == 1) ║ undefined ║
║ if (-1 == false) console.log("spam") ║ if (-1 == 0) ║ undefined ║
║ Order doesn't matter... ║ ║ ║
║ if (true == -1) console.log("spam") ║ if (1 == -1) ║ undefined ║
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (!!-1 == true) console.log("spam") ║ if (true == true) ║ spam ║ better
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (-1) console.log("spam") ║ if (truthy) ║ spam ║ still best
╚═══════════════════════════════════════╩═══════════════════╩═══════════╝
และสิ่งต่าง ๆ ก็ยิ่งบ้าคลั่งขึ้นอยู่กับเครื่องยนต์ของคุณ ตัวอย่างเช่น WScript จะชนะรางวัล
function test()
{
return (1 === 1);
}
WScript.echo(test());
เนื่องจากการหลอกลวงทางประวัติศาสตร์ของ Windows บางอย่างนั้นจะส่งออก -1 ในกล่องข้อความ! ลองใช้งานในพรอมต์ cmd.exe แล้วดู! แต่WScript.echo(-1 == test())
ยังช่วยให้คุณมี 0 หรือ false
WScript เบือนหน้า. มันน่าเกลียด
เปรียบเทียบความจริง :)
แต่ถ้าฉันมีสองค่าฉันต้องตรวจสอบความจริงที่เท่าเทียมกัน / falsi-ness?
แกล้งเรามีและmyVar1 = 0;
myVar2 = undefined;
myVar1 === myVar2
เป็น0 === undefined
และเห็นได้ชัดว่าเป็นเท็จ
!!myVar1 === !!myVar2
เป็น!!0 === !!undefined
และเป็นจริง! ความจริงเดียวกัน! (ในกรณีนี้ทั้งคู่ "มีความจริงเท็จ")
ดังนั้นที่เดียวที่คุณต้องใช้ "ตัวแปรแบบบูลีน" คือถ้าคุณมีสถานการณ์ที่คุณกำลังตรวจสอบว่าตัวแปรทั้งสองมีความเหมือนกันจริงไหม นั่นคือการใช้งาน!!
ถ้าคุณจำเป็นต้องดูว่าสอง vars มีทั้ง truthy หรือทั้งสอง falsy (หรือไม่), ที่อยู่, เท่ากัน (หรือไม่) truthiness
ฉันไม่สามารถนึกถึงกรณีการใช้งานที่ยอดเยี่ยม บางทีคุณอาจมีฟิลด์ "ลิงก์" ในฟอร์มหรือไม่
if (!!customerInput.spouseName !== !!customerInput.spouseAge ) {
errorObjects.spouse = "Please either enter a valid name AND age "
+ "for your spouse or leave all spouse fields blank.";
}
ดังนั้นตอนนี้ถ้าคุณมีความจริงสำหรับทั้งคู่หรือเป็นเท็จสำหรับทั้งคู่สมรสชื่อและอายุคุณสามารถดำเนินการต่อ มิฉะนั้นคุณจะมีเพียงหนึ่งฟิลด์ที่มีค่า (หรือการแต่งงานที่จัดเร็วมาก) และจำเป็นต้องสร้างข้อผิดพลาดพิเศษในerrorObjects
คอลเลกชันของคุณ
แก้ไข 24 ต.ค. 2560, 6 ก.พ. 19:
ไลบรารีของบุคคลที่สามที่ต้องการค่าบูลีนที่ชัดเจน
นี่เป็นกรณีที่น่าสนใจ ... !!
อาจเป็นประโยชน์เมื่อ libs บุคคลที่สามคาดหวังค่าบูลีนที่ชัดเจน
ตัวอย่างเช่นFalse ใน JSX (ตอบสนอง) มีความหมายพิเศษที่ไม่ถูกเรียกใช้บนความเท็จง่าย หากคุณลองส่งคืนสิ่งต่อไปนี้ใน JSX ของคุณคาดว่าจะมี int ในmessageCount
...
{messageCount && <div>You have messages!</div>}
... คุณอาจประหลาดใจที่เห็น React ทำการแสดง0
เมื่อคุณไม่มีข้อความ คุณต้องส่งคืนเท็จอย่างชัดเจนสำหรับ JSX ที่จะไม่แสดงผล ข้อความข้างต้นส่งคืน0
ซึ่ง JSX แสดงผลอย่างมีความสุขเท่าที่ควร มันไม่สามารถบอกคุณไม่ได้มีCount: {messageCount && <div>Get your count to zero!</div>}
(หรือสิ่งประดิษฐ์น้อยกว่า)
One fix เกี่ยวข้องกับ bangbang ซึ่งมีการรวม0
เข้า!!0
ด้วยfalse
กันคือ:
{!!messageCount && <div>You have messages!</div>}
JSX 'docs แนะนำให้คุณชัดเจนยิ่งขึ้นเขียนโค้ดการคอมเม้นต์ตนเองและใช้การเปรียบเทียบเพื่อบังคับให้บูลีน
{messageCount > 0 && <div>You have messages!</div>}
ฉันสะดวกสบายกว่าในการจัดการความเท็จด้วยตัวเองประกอบไปด้วย -
{messageCount ? <div>You have messages!</div> : false}
ดีลเดียวกันใน typescript: หากคุณมีฟังก์ชั่นที่ส่งกลับค่าบูลีน (หรือคุณกำลังกำหนดค่าให้กับตัวแปรบูลีน) คุณ [ปกติ] ไม่สามารถคืน / กำหนดค่าบูลีน -y ได้ มันต้องเป็นบูลีนที่พิมพ์ออกมาอย่างแรง วิธีนี้IFF myObject
จะพิมพ์มั่น , return !myObject;
การทำงานสำหรับฟังก์ชั่นที่กลับมาบูล แต่return myObject;
ไม่ได้ คุณต้องreturn !!myObject
ตรงกับความคาดหวังของ typescript
ข้อยกเว้นสำหรับ Typescript? หากmyObject
เป็นany
คุณจะกลับมาที่ Wild West ของ JavaScript และสามารถส่งคืนได้โดยไม่ต้องใช้!!
แม้ว่าจะเป็นประเภทบูลีนก็ตาม
โปรดทราบว่าเหล่านี้เป็น JSX & typescript ประชุม , ไม่ได้คนโดยธรรมชาติเพื่อ JavaScript
แต่ถ้าคุณเห็นสิ่งแปลก ๆ0
ใน JSX ที่แสดงผลของคุณให้คิดการจัดการที่ผิดพลาด