การทำงานตัวเทียบ ECMAScript

ประเมินตัวเปรียบเทียบทำงานเพื่อเปรียบเทียบ และในทุกประเมินตัวเรื่อง จะกลับค่า Boolean หนึ่ง

วิธีเปรียบเทียบปกติ

ประเมินตัวต่ำกว่า มากกว่า ต่ำกว่าหรือมากกว่าเท่า ตั้งแต่สองตัวเลข ทำงานเหมือนการเปรียบเทียบคณิตศาสตร์ ของสองตัวเลข

ในทุกประเมินตัวเรื่อง จะกลับค่า Boolean หนึ่ง:

var bResult1 = 2 > 1	//true
var bResult2 = 2 < 1	//false

อย่างไรก็ตาม การนำเสนอการเรียกใช้ประเมินตัวเลขสำหรับสองข้อความนี้ มีพฤติกรรมที่แตกต่างกัน หลายคนคิดว่า "ต่ำ" หมายถึง "อยู่ในลำดับอักษรที่หน้า" และ "มากกว่า" หมายถึง "อยู่ในลำดับอักษรที่ข้างหลัง" แต่เรื่องนี้ไม่ได้เป็นจริง สำหรับข้อความ การเปรียบเทียบจะเป็นการเปรียบเทียบตัวอักษรของข้อความแรกกับตัวอักษรที่ตำแหน่งเดียวกันของข้อความที่สอง หลังจากที่เปรียบเทียบสิ้นสุด จะกลับค่า Boolean หนึ่ง ปัญหานี้เกิดขึ้นเพราะรหัสอักษรใหญ่ทั้งหมดเล็กกว่ารหัสอักษรเล็ก ซึ่งหมายความว่าอาจเกิดสถานการณ์ดังนี้:

var bResult = "Blue" < "alpha";
alert(bResult);	// แสดง true

ในตัวอย่างที่ผ่านมา ตัวอักษร "Blue" ต่ำกว่า "alpha" เพราะรหัสอักษร B คือ 66 และรหัสอักษร a คือ 97 ถ้าต้องการเปรียบเทียบตามลำดับอักษรที่แท้จริง ต้องเปลี่ยนตัวเลขทั้งสองเป็นรูปแบบในเกณฑ์ตัวใหญ่หรือตัวเล็ก ก่อนที่จะเปรียบเทียบ:

var bResult = "Blue".toLowerCase() < "alpha".toLowerCase();
alert(bResult);	// ออก false

แปลงทั้งสองตัวเลขเป็นตัวอักษรต่ำเพื่อให้สามารถรับรู้ถึงความถูกต้องในลำดับตัวอักษร ดังนั้น "alpha" จะอยู่ก่อน "Blue" ในลำดับตัวอักษร

เทียบเทียบตัวเลขและตัวอักษร

สถานการณ์ที่ยากที่แสนยากอีกด้วยเกิดขึ้นเมื่อเทียบเทียบตัวเลขที่เป็นตัวอักษรเช่นนี้ ตัวอย่างเช่น:

var bResult = "25" < "3";
alert(bResult);	// ออก "true"

โค้ดด้านบนเทียบเทียบตัวอักษร "25" กับ "3" ทั้งสองตัวเลขเป็นตัวอักษร ดังนั้นเทียบเท่าตามรหัสอักษร (รหัสอักษรของ "2" คือ 50 และรหัสอักษรของ "3" คือ 51)

แต่ถ้าเปลี่ยนหนึ่งในตัวเลขเป็นตัวเลข ผลลัพธ์ก็จะน่าสนใจ:

var bResult = "25" < 3;
alert(bResult);	// ออก "false"

ที่นี้ ตัวอักษร "25" จะถูกแปลงเป็นตัวเลข 25 แล้วเทียบเท่ากับตัวเลข 3 ตามที่คาดการณ์ไว้

ในทุกกรณีที่เปรียบเทียบตัวเลขและตัวอักษร ECMAScript จะแปลงตัวอักษรเป็นตัวเลข แล้วเทียบเท่าตามลำดับตัวเลข

แต่ว่าถ้าตัวอักษรไม่สามารถแปลงเป็นตัวเลขได้แล้วจะเป็นอย่างไร? จับตาดูตัวอย่างด้านล่างนี้:

var bResult = "a" < 3;
alert(bResult);

คุณสามารถคาดการณ์ถึงรายงานของโค้ดนี้ได้ไหม? ตัวอักษร "a" ไม่สามารถแปลงเป็นตัวเลขที่มีความหมายได้ แต่ถ้าเรียกใช้วิธี parseInt() ก็จะได้ค่า NaN ตามกฎ ในทางเดียวกันที่ค่า NaN ในการคำนวณเชื่อมโยงจะต้องหมดค่า false ดังนั้นโค้ดนี้ก็จะหมดค่า false

var bResult = "a" >= 3;
alert(bResult);

โดยทั่วไป ถ้าค่าที่ใช้ในการคำนวณเทียบเท่าต่ำกว่าเท่านั้นจะหมดค่า false แล้ว ในขณะที่การคำนวณเทียบเท่ามากกว่าเท่านั้นจะต้องหมดค่า true แต่ถ้ามีตัวเลขเป็น NaN สถานการณ์ก็จะไม่เหมือนนั้น