มีคำถามดังกล่าว ในคำถามทดสอบ ที่รวบรวมโดย cssrain:
<SCRIPT LANGUAGE="จาวาสคริปต์">
วาร์ ก = 0;
วาร์ ข = -1;
วาร์ ค = 1;
ฟังก์ชั่นยืนยัน (aVar) {
ถ้า (aVar==true) แจ้งเตือน (จริง);
การแจ้งเตือนอื่น (เท็จ);
-
ยืนยัน (ก);
ยืนยัน(ข);
ยืนยัน(ค);
</สคริปต์>
เรียกใช้กล่องรหัส
[Ctrl+A เลือกเคล็ดลับทั้งหมด: คุณสามารถแก้ไขบางส่วนของโค้ดก่อนแล้วจึงกด Run]
ตามความเข้าใจของฉัน ค่าบูลีนใดๆ ที่ไม่ใช่ 0 ควรเป็นจริง
แต่ผลลัพธ์ที่ถูกต้องของคำถามนี้คือ: false false true
ค่าของ (-1==true) เป็นเท็จ
ลองดูตัวอย่างต่อไปนี้:
<SCRIPT LANGUAGE="จาวาสคริปต์">
วาร์ ก = 0;
วาร์ ข = -1;
วาร์ ค = 1;
ฟังก์ชั่นยืนยัน (aVar) {
ถ้า (aVar) แจ้งเตือน (จริง);
การแจ้งเตือนอื่น (เท็จ);
-
ยืนยัน (ก);
ยืนยัน(ข);
ยืนยัน(ค);
</สคริปต์>
เรียกใช้กล่องรหัส
[Ctrl+A เลือกเคล็ดลับทั้งหมด: คุณสามารถแก้ไขบางส่วนของโค้ดก่อนแล้วจึงกด Run]
ผลการรันคือ: เท็จ, จริง, จริง
ที่นี่เราพบว่าผลลัพธ์ของ if(aVar) และ if(aVar == true) ไม่เหมือนกัน
คำอธิบายของ cssrain ใน คำตอบ คือ:
if(aVar) และ if (aVar==true) มีคำตอบที่แตกต่างกันมากสำหรับจำนวนลบ
มันเป็นสาเหตุของจำนวนลบจริงหรือ? ลองพิจารณาตัวอย่างต่อไปนี้:
เรียกใช้กล่องรหัส
[Ctrl+A เลือกเคล็ดลับทั้งหมด: คุณสามารถแก้ไขบางส่วนของโค้ดก่อนแล้วจึงกด Run]
เหตุใดจำนวนบวก 2 จึงกลับเป็นเท็จด้วย ลองแปลงตัวเลขให้เป็นค่าบูลีนแล้วลองดู
เรียกใช้กล่องรหัส
[Ctrl+A เลือกเคล็ดลับทั้งหมด: คุณสามารถแก้ไขบางส่วนของโค้ดก่อนแล้วจึงกด Run]
ค่าบูลีนที่ไม่ใช่ศูนย์ในที่นี้เป็นจริง ซึ่งหมายความว่าปัญหาทั้งหมดมุ่งเน้นไปที่ตัวดำเนินการ == ใน 2==true โดยพื้นฐานแล้วแน่นอนว่า == จะต้องไม่แปลงตัวเลขเป็นค่าบูลีนแล้วจึงเปรียบเทียบ
ดูสิ่งที่ ECMA-262 (หน้า 80) พูดว่า:
6.ถ้า Type(x) เป็นบูลีน ให้ส่งกลับผลลัพธ์ของการเปรียบเทียบ ToNumber(x) == y
7.ถ้า Type(y) เป็นบูลีน ให้ส่งกลับผลลัพธ์ของการเปรียบเทียบ x == ToNumber(y)
นั่นคือค่าบูลีนจะถูกแปลงเป็นตัวเลขก่อนแล้วจึงเปรียบเทียบ ค่าตัวเลขของจริงคือ 1 และเท็จคือ 0 ดังนั้น 2 หรือ -1 จึงไม่สามารถเป็นจริงได้
ลองดูตัวอย่างต่อไปนี้ให้ละเอียดยิ่งขึ้น:
<SCRIPT LANGUAGE="จาวาสคริปต์">
var a = "ไม่ได้กำหนด";
var b = "เท็จ";
วาร์ค = "";
ฟังก์ชั่นยืนยัน (aVar) {
ถ้า (aVar==true) แจ้งเตือน (จริง);
การแจ้งเตือนอื่น (เท็จ);
-
ยืนยัน (ก);
ยืนยัน(ข);
ยืนยัน(ค);
</สคริปต์>
เรียกใช้กล่องรหัส
[Ctrl+A เลือกเคล็ดลับทั้งหมด: คุณสามารถแก้ไขบางส่วนของโค้ดก่อนแล้วจึงกด Run]
ตามแนวคิดก่อนหน้านี้ จริงจะถูกแปลงเป็น 1 ดังนั้นทั้งสามคำสั่งจะส่งกลับเท็จ เรียกใช้และพบว่าเป็นเช่นนั้นจริงๆ
จากนั้น เปลี่ยน if(aVar==true) เป็น if(aVar)
เรียกใช้กล่องรหัส
[Ctrl+A เลือกเคล็ดลับทั้งหมด: คุณสามารถแก้ไขบางส่วนของโค้ดก่อนแล้วจึงกด Run]
ผลการวิ่ง ณ เวลานี้ จริง จริง เท็จ เนื่องจากผลลัพธ์ของ Boolean("unknown"), Boolean("false") และ Boolean("") เป็นจริง จริง และเท็จ สตริงที่ไม่ว่างจะถูกแปลงเป็นบูลีนจริง
สุดท้ายนี้มีตัวอย่างอธิบายกฎการเปรียบเทียบเมื่อทั้งสองด้านของ == เป็นสตริงและตัวเลข
เรียกใช้กล่องรหัส
[Ctrl+A เลือกเคล็ดลับทั้งหมด: คุณสามารถแก้ไขบางส่วนของโค้ดก่อนแล้วจึงกด Run]
คุณพบว่า "001"==true นี้เป็นจริงหรือไม่
เพราะจริงจะถูกแปลงเป็น 1 ก่อน จากนั้นอ้างถึงกฎของ ECMA:
4.ถ้า Type(x) คือ Number และ Type(y) คือ String ให้ส่งกลับผลลัพธ์ของการเปรียบเทียบ x == ToNumber(y)
5.ถ้า Type(x) คือ String และ Type(y) คือ Number ให้ส่งกลับผลลัพธ์ของการเปรียบเทียบ ToNumber(x) == y
สตริงจะถูกแปลงเป็นตัวเลข และค่าของ Number("001") ก็คือ 1 ดังนั้นผลลัพธ์จึงเป็นจริง