มันเป็นไปตามสเป็ค
12.5 คำแถลง if
.....
2. ถ้า ToBoolean (GetValue (exprRef)) เป็นจริง
ส่งคืนผลลัพธ์ของการประเมินคำสั่งแรก
3. อื่น ๆ
....
ToBoolean ตามสเป็คคือ
การดำเนินการนามธรรม ToBoolean แปลงอาร์กิวเมนต์เป็นค่าประเภทบูลีนตามตารางที่ 11:
และตารางนั้นบอกสิ่งนี้เกี่ยวกับสตริง:
ผลลัพธ์จะเป็นเท็จถ้าอาร์กิวเมนต์เป็นสตริงว่าง (ความยาวของมันคือศูนย์); มิฉะนั้นผลลัพธ์จะเป็นจริง
ตอนนี้เพื่ออธิบายว่าทำไม"0" == false
คุณควรอ่านโอเปอเรเตอร์ความเสมอภาคซึ่งระบุว่ามันได้รับคุณค่าจากการดำเนินการเชิงนามธรรมGetValue(lref)
ที่เหมือนกันสำหรับด้านขวา
ซึ่งอธิบายส่วนที่เกี่ยวข้องนี้เป็น:
ถ้า IsPropertyReference (V) แสดงว่า
ถ้า HasPrimitiveBase (V) เป็นเท็จดังนั้นให้รับเป็น [[รับ]] วิธีการภายในของฐานมิฉะนั้นให้ได้รับ
เป็นวิธีพิเศษภายใน [[รับ]] ที่กำหนดไว้ด้านล่าง
ข ส่งคืนผลลัพธ์ของการเรียกวิธีรับภายในโดยใช้ฐานเป็นค่านี้และส่งผ่าน
GetReferencedName (V) สำหรับอาร์กิวเมนต์
หรือในคำอื่น ๆ สตริงมีฐานดั้งเดิมซึ่งโทรกลับวิธีรับภายในและจบลงด้วยการมองเท็จ
หากคุณต้องการประเมินสิ่งต่าง ๆ โดยใช้การดำเนินการ GetValue ==
หากคุณต้องการประเมินการใช้งานToBoolean
ให้ใช้===
(หรือที่เรียกว่าตัวดำเนินการความเท่าเทียม "เข้มงวด")
"0"
เป็นสตริงและเนื่องจากไม่ว่างเปล่าจึงประเมินเป็นจริง