การคำนวณทางความเสมอ ECMAScript

การตรวจสอบความเท่าเทียมของสองตัวแปรเป็นการปฏิบัติที่สำคัญในการออกแบบโปรแกรม ในการจัดการค่าตัวเดิม การปฏิบัตินี้เป็นที่ง่าย แต่เมื่อมีวัตถุ งานก็เล็กน้อยลำบากขึ้น

ECMAScript มีสองชุดสัญญาณเสมอนั้น และไม่เสมอนั้น สำหรับการจัดการค่าตัวเดิม และสัญญาณเสมอนั้นและไม่เสมอนั้นสำหรับวัตถุ

เสมอนั้นและไม่เสมอนั้น

ใน ECMAScript สัญญาณเสมอนั้นเป็นเสมอนั้น (==) มันกลับค่า true เมื่อและเฉพาะเมื่อสองตัวประกาศเท่ากัน สัญญาณไม่เสมอนั้นเป็น ! (!=) มันกลับค่า true เมื่อและเฉพาะเมื่อสองตัวประกาศไม่เท่ากัน สำหรับตั้งตัวประกาศเท่าเทียมหรือไม่เท่ากัน ทั้งสองสัญญาณนี้จะทำการแปลงประเภท

กฎการแปลงประเภทตามต่อไปนี้:

  • ถ้าตัวประกาศหนึ่งเป็นค่า Boolean ก่อนการตรวจสอบความเท่าเทียม ต้องแปลงมันเป็นค่าเลข ค่า false แปลงเป็น 0 และค่า true แปลงเป็น 1
  • ถ้าตัวประกาศหนึ่งเป็นตัวอักษร และตัวประกาศอีกตัวเป็นตัวเลข ก่อนการตรวจสอบความเท่าเทียม ต้องพยายามแปลงตัวอักษรให้เป็นตัวเลข
  • ถ้าตัวประกาศหนึ่งเป็นวัตถุ และตัวประกาศอีกตัวเป็นตัวอักษร ก่อนการตรวจสอบความเท่าเทียม ต้องพยายามแปลงวัตถุให้เป็นตัวอักษร
  • ถ้าตัวประกาศหนึ่งเป็นวัตถุ และตัวประกาศอีกตัวเป็นตัวเลข ก่อนการตรวจสอบความเท่าเทียม ต้องพยายามแปลงวัตถุให้เป็นตัวเลข

ในการเปรียบเทียบ ตัวประกาศนี้ยังปฏิบัติตามกฎต่อไปนี้:

  • ค่า null และ undefined เท่ากัน
  • ในการตรวจสอบความเท่าเทียม ไม่สามารถแปลงค่า null และ undefined ไปเป็นค่าอื่นได้
  • ถ้าตัวประกาศหนึ่งเป็น NaN เสมอนั้นกลับค่า false ไม่เท่ากับกลับค่า true。
  • ถ้าสองตัวประกาศทั้งสองเป็นวัตถุ การเปรียบเทียบคือการเปรียบเทียบค่าอ้างอิงของมัน ถ้าสองตัวประกาศนำไปสู่วัตถุเดียวกัน เสมอนั้นกลับค่า true ไม่เท่ากับวัตถุทั้งสองไม่เท่ากัน。

คำเตือนสำคัญ:แม้ว่าจะมีสองตัวเลขทั้งสองเป็น NaN แต่เสมอนั้นยังคงกลับค่า false เพราะตามกฎ NaN ไม่เท่ากับ NaN。

ตารางด้านล่างนี้นำออกสถานการณ์พิเศษบางอย่างและผลลัพธ์ของมัน:

แสดง式 ค่า
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true

เสมอกัน ( === ) และไม่เท่ากัน ( !== )

เสมอกัน ( === ) และไม่เท่ากัน ( !== ) นั้นเหมือนกับเสมอ ( == ) และไม่เท่ากัน ( != ) ตามลำดับ ทั้งสองเปรียบเทียบความเท่ากัน แต่ไม่ทำการปรับปรุงประเภทก่อนเปรียบเทียบ

เสมอกัน ( === ) นำเสนอด้วยขอบเขตเซอร์ดิวัลส์ ( === ) มีความถูกต้องเมื่อองค์ประกอบไม่ต้องทำการปรับปรุงประเภท ทำให้กลับมาเป็น true

ตัวอย่าง

var sNum = "66";
var iNum = 66;
alert(sNum == iNum);	// ออก "true"
alert(sNum === iNum);	// ออก "false"

ในรหัสที่มีอยู่ การใช้ alert แรกใช้เสมอ ( == ) ในการเปรียบเทียบข้อความ "66" กับตัวเลข 66 จึงออก "true" ตามที่กล่าวไปแล้ว เนื่องจากข้อความ "66" จะถูกเปลี่ยนเป็นตัวเลข 66 ก่อนที่จะเปรียบเทียบกับตัวเลขอื่น การใช้ alert ที่สองใช้เสมอ ( == ) ในการเปรียบเทียบข้อความและตัวเลขโดยไม่มีการปรับปรุงประเภท ซึ่งเห็นได้ว่าข้อความไม่เท่ากันกับตัวเลข ดังนั้นจึงออก "false"

ไม่เท่ากัน ( !== ) นำเสนอด้วยขอบเขตเซอร์ดิวัลส์ ( !== ) มีความถูกต้องเมื่อองค์ประกอบไม่ต้องทำการปรับปรุงประเภท ทำให้กลับมาเป็น true

ตัวอย่าง

var sNum = "66";
var iNum = 66;
alert(sNum != iNum);	// ออก "false"
alert(sNum !== iNum);	// ออก "true"

ที่นี่ การใช้ alert แรกใช้ไม่เท่ากัน ( !== ) ในการเปลี่ยนข้อความ "66" ให้เป็นตัวเลข 66 ดังนั้นมันจึงเท่ากันกับองค์ประกอบที่สอง 66 ดังนั้นค่าที่หาได้คือ "false" เพราะองค์ประกอบทั้งสองเท่ากัน การใช้ alert แรกใช้ไม่เท่ากัน ( !== ) ของการประเมินความแตกต่าง การประเมินคือการถามว่า "sNum" และ "iNum" ต่างกันหรือไม่? ตอบคำถามนี้คือใช่ (true) เพราะ sNum คือข้อความ และ iNum คือตัวเลข พวกเขาต่างกันตรงที่แน่นอน