diff --git a/1-js/02-first-steps/09-comparison/article.md b/1-js/02-first-steps/09-comparison/article.md index 20580813e..bb249116d 100644 --- a/1-js/02-first-steps/09-comparison/article.md +++ b/1-js/02-first-steps/09-comparison/article.md @@ -1,101 +1,101 @@ -## การเปรียบเทียบ +# การเปรียบเทียบ -เราทุกคนรู้จักตัวดำเนินการเปรียบเทียบจากวิชาคณิตศาสตร์กันอยู่แล้ว +เรารู้จักเครื่องหมายเปรียบเทียบ9y;อย่างจากคณิตศาสตร์ -ใน JavaScript ตัวดำเนินการเปรียบเทียบเขียนแบบนี้: +ใน JavaScript เขียนได้ดังนี้: -- มากกว่า/น้อยกว่า: `a > b`, `a < b`. -- มากกว่า/น้อยกว่าหรือเท่ากับ: `a >= b`, `a <= b`. -- เท่ากับ: `a == b`, โปรดทราบว่าเครื่องหมายเท่ากับสองตัว `==` หมายถึงการทดสอบความเท่ากับ ในขณะที่เครื่องหมายเท่ากับตัวเดียว `a = b` หมายถึงการกำหนดค่า -- ไม่เท่ากับ: ในคณิตศาสตร์ใช้สัญลักษณ์ `≠` แต่ใน JavaScript เขียนเป็น `a != b` +- มากกว่า/น้อยกว่า: a > b, a < b +- มากกว่าหรือเท่ากับ/น้อยกว่าหรือเท่ากับ: a >= b, a <= b +- เท่ากับ: `a == b` สังเกตว่าต้องใช้เครื่องหมายเท่ากับสองตัว `==` สำหรับการเช็คความเท่ากัน ส่วนเครื่องหมายเดียว `a = b` ใช้สำหรับการกำหนดค่า +- ไม่เท่ากับ: ในเชิงคณิตศาสตร์ใช้สัญลักษณ์ แต่ใน JavaScript เขียนเป็น a != b -ในบทความนี้ เราจะเรียนรู้เพิ่มเติมเกี่ยวกับประเภทของการเปรียบเทียบที่แตกต่างกัน ว่า JavaScript เปรียบเทียบอย่างไร รวมถึงความแปลกประหลาดที่สำคัญ +ในบทความนี้ เราจะเรียนรู้เพิ่มเติมเกี่ยวกับการเปรียบเทียบแบบต่างๆ วิธีที่ JavaScript เปรียบเทียบ รวมถึงข้อควรระวังสำคัญ -ในตอนท้าย คุณจะได้พบกับสูตรเด็ดในการหลีกเลี่ยงปัญหาที่เกี่ยวข้องกับ "JavaScript Quirks" +ท้ายบทความมีเคล็ดลับดีๆ ในการหลีกเลี่ยงปัญหาที่มักพบใน JavaScript -## เปรียบเทียบแล้วได้บูลีน (Boolean) +## ผลลัพธ์เป็น Boolean -ตัวดำเนินการเปรียบเทียบทั้งหมดจะส่งคืนค่า **บูลีน (Boolean)**: +ผลการเปรียบเทียบทั้งหมดจะให้ค่า boolean: -- `true` -- หมายถึง "ใช่" "ถูกต้อง" หรือ "ความจริง" -- `false` -- หมายถึง "ไม่ใช่" "ผิด" หรือ "ไม่ใช่ความจริง" +- `true` หมายถึง "ใช่" "ถูกต้อง" หรือ "จริง" +- `false` หมายถึง "ไม่" "ไม่ถูกต้อง" หรือ "ไม่จริง" ตัวอย่างเช่น: ```js run -alert( 2 > 1 ); // true (ใช่) -alert( 2 == 1 ); // false (ไม่ใช่) -alert( 2 != 1 ); // true (ใช่) +alert( 2 > 1 ); // true (ถูก) +alert( 2 == 1 ); // false (ไม่ถูก) +alert( 2 != 1 ); // true (ถูก) ``` -ผลลัพธ์ของการเปรียบเทียบสามารถกำหนดให้กับตัวแปรได้เช่นเดียวกับค่าอื่นๆ: +ผลการเปรียบเทียบสามารถเก็บในตัวแปรได้ เหมือนกับค่าอื่นๆ: ```js run -let result = 5 > 4; // กำหนดผลลัพธ์ของการเปรียบเทียบ +let result = 5 > 4; // เก็บผลการเปรียบเทียบ alert( result ); // true ``` -## เปรียบเทียบสตริง (String) +## การเปรียบเทียบ string -เพื่อดูว่าสตริงหนึ่งมากกว่าอีกสตริงหนึ่งหรือไม่ JavaScript ใช้ลำดับที่เรียกว่า "พจนานุกรม" หรือ "lexicographical" +ในการเช็คว่า string อันหนึ่งมากกว่าอีกอันหรือไม่ JavaScript ใช้การเรียงลำดับแบบ "พจนานุกรม" หรือ "ตามตัวอักษร" -กล่าวอีกนัยหนึ่ง สตริงจะถูกเปรียบเทียบทีละตัวอักษร +หรือพูดง่ายๆ คือเปรียบเทียบ string ทีละตัวอักษร ตัวอย่างเช่น: ```js run alert( 'Z' > 'A' ); // true alert( 'Glow' > 'Glee' ); // true -alert( 'Bee' > 'Be' ); // true +alert( 'Bee' > 'Be' ); // true ``` -ขั้นตอนการเปรียบเทียบสตริงสองสตริงทำได้ง่ายๆ ดังนี้: +ขั้นตอนในการเปรียบเทียบ string สองอันมีดังนี้: -1. เปรียบเทียบตัวอักษรตัวแรกของทั้งสองสตริง -2. ถ้าตัวอักษรตัวแรกของสตริงแรกมากกว่า (หรือน้อยกว่า) ตัวอักษรของอีกสตริง แสดงว่าสตริงแรกมากกว่า (หรือน้อยกว่า) สตริงที่สอง เสร็จเรียบร้อย -3. มิฉะนั้น ถ้าตัวอักษรตัวแรกของทั้งสองสตริงเหมือนกัน ให้เปรียบเทียบตัวอักษรตัวที่สองเช่นเดียวกัน -4. ทำซ้ำจนกว่าจะถึงจุดสิ้นสุดของสตริงใดสตริงหนึ่ง -5. ถ้าทั้งสองสตริงจบลงที่ความยาวเท่ากัน แสดงว่าทั้งสองสตริงเท่ากัน มิฉะนั้น สตริงที่ยาวกว่าจะใหญ่กว่า +1. เปรียบเทียบตัวอักษรตัวแรกของ string ทั้งสองอัน +2. ถ้าตัวอักษรตัวแรกจาก string แรกมากกว่า (หรือน้อยกว่า) string ที่สอง แสดงว่า string แรกมากกว่า (หรือน้อยกว่า) string ที่สอง จบการทำงาน +3. ถ้าตัวอักษรตัวแรกของ string ทั้งสองเหมือนกัน ให้เปรียบเทียบตัวอักษรที่สองแบบเดียวกัน +4. ทำซ้ำไปเรื่อยๆ จนกว่าจะเจอตัวอักษรที่แตกต่างกันหรือจนหมด string +5. ถ้าหมด string พร้อมกันที่ความยาวเท่ากัน แปลว่าเท่ากัน ไม่อย่างนั้น string ที่ยาวกว่าจะมากกว่า -ในตัวอย่างแรกข้างต้น การเปรียบเทียบ `'Z' > 'A'` จะได้ผลลัพธ์ในขั้นตอนแรก +ในตัวอย่างแรกข้างบน การเปรียบเทียบ `'Z' > 'A'` ให้ผลลัพธ์ตั้งแต่ขั้นตอนแรก -การเปรียบเทียบที่สอง `'Glow'` และ `'Glee'` ต้องใช้ขั้นตอนเพิ่มเติมเนื่องจากสตริงถูกเปรียบเทียบทีละตัวอักษร: +การเปรียบเทียบที่สองระหว่าง `'Glow'` กับ `'Glee'` ต้องใช้หลายขั้นตอนมากกว่า โดยเปรียบเทียบตัวอักษรทีละตัว: -1. `G` เหมือนกับ `G` -2. `l` เหมือนกับ `l` -3. `o` มากกว่า `e` หยุดตรงนี้. สตริงแรกมากกว่า +1. `G` เท่ากับ `G` +2. `l` เท่ากับ `l` +3. `o` มากกว่า `e` หยุดตรงนี้ string แรกมากกว่า ```smart header="ไม่ใช่พจนานุกรมจริงๆ แต่เป็นลำดับ Unicode" -ขั้นตอนการเปรียบเทียบที่ให้ไว้ข้างต้นนั้นเทียบเท่ากับที่ใช้ในพจนานุกรมหรือสมุดโทรศัพท์ แต่ไม่เหมือนกันซะทีเดียว +ขั้นตอนการเปรียบเทียบข้างต้นคล้ายกับที่ใช้ในพจนานุกรมหรือสมุดโทรศัพท์ แต่ไม่เหมือนกันทีเดียว -ตัวอย่างเช่น ตัวพิมพ์ใหญ่มีผล ตัวพิมพ์ใหญ่ `"A"` ไม่เท่ากับตัวพิมพ์เล็ก `"a"` ตัวไหนใหญ่กว่า? ตัวพิมพ์เล็ก `"a"`. ทำไม? เนื่องจากตัวอักษรตัวเล็กมีดัชนีที่สูงกว่าในตารางการเข้ารหัสภายในที่ JavaScript ใช้ (Unicode) เราจะกลับมาดูรายละเอียดและผลที่ตามมาของเรื่องนี้ในบท . +เช่น ตัวพิมพ์ใหญ่เล็กมีผล `"A"` ไม่เท่ากับ `"a"` ตัวไหนมากกว่า? `"a"` เพราะมันมีค่าดัชนีที่สูงกว่าในตารางเข้ารหัสภายใน (Unicode) ที่ JavaScript ใช้ เราจะกลับมาดูรายละเอียดและผลที่ตามมาในบท ``` -## เปรียบเทียบคนละแบบ (Comparison of different types) +## การเปรียบเทียบข้อมูลต่างชนิด -เวลาเปรียบเทียบค่าคนละแบบ JavaScript จะแปลงค่าเหล่านั้นเป็นตัวเลขเหมือนทำเวทมนตร์! +เมื่อเปรียบเทียบค่าที่มีชนิดต่างกัน JavaScript จะแปลงค่าเป็นตัวเลขก่อน ตัวอย่างเช่น: ```js run -alert( '2' > 1 ); // true, string '2' becomes a number 2 -alert( '01' == 1 ); // true, string '01' becomes a number 1 +alert( '2' > 1 ); // true, string '2' จะถูกแปลงเป็นตัวเลข 2 +alert( '01' == 1 ); // true, string '01' จะถูกแปลงเป็นตัวเลข 1 ``` -สำหรับค่าบูลีน `true` จะกลายเป็น `1` และ `false` จะกลายเป็น `0` เหมือนการเปิดไฟ (true) กับปิดไฟ (false) +สำหรับค่า boolean `true` จะกลายเป็น `1` และ `false` จะกลายเป็น `0` -For example: +ตัวอย่างเช่น: ```js run -alert( true == 1 ); // true +alert( true == 1 ); // true alert( false == 0 ); // true ``` -````smart header="สนุกกับผลลัพธ์" -บางครั้งอาจเกิดขึ้นพร้อมกัน: +````smart header="ผลลัพธ์ที่แปลกประหลาด" +มันเป็นไปได้ว่าในเวลาเดียวกัน: -- สองค่าเท่ากัน -- หนึ่งในนั้นเป็น `true` อีกอันเป็น `false` +- สองค่านั้นเท่ากัน +- แต่ค่าหนึ่งเป็น `true` เมื่อแปลงเป็น boolean ส่วนอีกค่าเป็น `false` เมื่อแปลงเป็น boolean ตัวอย่างเช่น: @@ -103,119 +103,114 @@ alert( false == 0 ); // true let a = 0; alert( Boolean(a) ); // false -let b = "0"; +let b = "0"; alert( Boolean(b) ); // true alert(a == b); // true! ``` -จากมุมมองของ JavaScript ผลลัพธ์นี้ค่อนข้างปกติ การตรวจสอบความเท่ากันจะแปลงค่าโดยใช้การแปลงตัวเลข (ดังนั้น `"0"` จึงกลายเป็น `0`) ในขณะที่การแปลง `Boolean` อย่างชัดเจนใช้อีกชุดของกฎ +จากมุมมองของ JavaScript ผลลัพธ์นี้ถือว่าปกติ การเช็คความเท่ากันจะแปลงค่าโดยใช้การแปลงเป็นตัวเลข (ทำให้ `"0"` เป็น `0`) ในขณะที่การแปลงเป็น `Boolean` โดยตรงใช้ชุดกฎที่แตกต่างกัน ```` -## เปรียบเทียบแบบเข้มงวด (Strict equality) +## ความเท่าเทียมกันอย่างเข้มงวด -เปรียบเทียบแบบธรรมดาๆ `==` มีปัญหาอยู่! มันแยกความแตกต่างระหว่าง `0` กับ `false` ไม่ได้ +การตรวจสอบความเท่าเทียมกันแบบปกติด้วย `==` มีปัญหาคือไม่สามารถแยกแยะความแตกต่างระหว่าง `0` กับ `false` ได้: ```js run alert( 0 == false ); // true ``` -เหมือนตาบอดสีเลย! - -ก็มันแปลง `0` กับ `false` ให้กลายเป็นตัวเลขเหมือนกันซะนี่ +เหตุการณ์เดียวกันนี้เกิดขึ้นกับ string ว่างด้วย: -```js run +```js run alert( '' == false ); // true ``` -เอาไงดีล่ะถ้าอยากแยก `0` กับ `false` ออกจากกัน? +สิ่งนี้เกิดขึ้นเพราะเมื่อเปรียบเทียบข้อมูลคนละชนิดด้วยเครื่องหมาย `==` JavaScript จะแปลงชนิดข้อมูลเป็นตัวเลขก่อน ทั้ง string ว่างและ `false` จะถูกแปลงเป็นศูนย์ -**ใช้การเปรียบเทียบแบบเข้มงวด `===` สิ!** +แล้วถ้าเราอยากแยกแยะความแตกต่างระหว่าง `0` กับ `false` ล่ะ จะทำอย่างไร? -ตัวดำเนินการนี้เปรียบเทียบแบบละเอียด ไม่ต้องแปลงชนิดข้อมูล +**เครื่องหมายเท่ากันอย่างเข้มงวด `===` จะเปรียบเทียบความเท่าเทียมกันโดยไม่แปลงชนิดข้อมูล** -พูดอีกอย่างก็คือ ถ้า `a` กับ `b` มีชนิดข้อมูลต่างกัน `a === b` จะรีบส่งคืน `false` ทันทีแบบไม่ต้องพยายามแปลง +อีกนัยหนึ่ง ถ้า `a` และ `b` เป็นคนละชนิดกัน `a === b` จะคืนค่า `false` ทันที โดยไม่พยายามแปลงชนิดข้อมูล -ลองดู: +ลองดูตัวอย่าง: ```js run -alert( 0 === false ); // false เพราะชนิดข้อมูลต่างกัน +alert( 0 === false ); // false เพราะเป็นคนละชนิดกัน ``` -นอกจากนี้ยังมีตัวดำเนินการ "ไม่เท่าเทียมแบบเข้มงวด" `!==` ที่คล้ายกับ `!=` - -ตัวดำเนินการความเท่าเทียมแบบเข้มงวดเขียนยาวกว่าเล็กน้อย แต่ทำให้เห็นได้ชัดว่าเกิดอะไรขึ้นและมีโอกาสเกิดข้อผิดพลาดน้อยลง - -## เปรียบเทียบกับ null และ undefined +นอกจากนี้ยังมีเครื่องหมาย "ไม่เท่ากันอย่างเข้มงวด" `!==` ที่คล้ายกับ `!=` ด้วย -เดี๋ยวๆๆๆๆ มีเรื่องตลกๆ เกี่ยวกับการเปรียบเทียบ `null` และ `undefined` กับค่าอื่นๆ นะ +การใช้เครื่องหมายเท่ากันแบบเข้มงวดอาจเขียนยาวขึ้นหน่อย แต่จะทำให้เห็นชัดเจนว่าเกิดอะไรขึ้นและลดโอกาสเกิดข้อผิดพลาดได้มากกว่า -**เปรียบเทียบแบบเข้มงวด `===`** +## การเปรียบเทียบกับ null และ undefined -สองคนนี้ต่างกันนะ เพราะคนละชนิดกัน +เมื่อ `null` หรือ `undefined` ถูกนำมาเปรียบเทียบกับค่าอื่นๆ อาจเกิดพฤติกรรมที่ไม่ตรงกับความคาดหมายเสมอไป - ```js run - alert( null === undefined ); // false - ``` +สำหรับการตรวจสอบความเท่ากันอย่างเข้มงวดด้วย `===`: +: ค่าเหล่านี้แตกต่างกัน เพราะแต่ละค่ามีประเภทข้อมูลต่างกัน -**เปรียบเทียบแบบธรรมดา `==`** - -อุ๊ย! มีกฎลับ! สองคนนี้เป็น "คู่รักสุดคิ้วท์": เท่ากัน (ตาม `==`) แต่ไม่เท่ากับค่าอื่นๆ นะ +```js run +alert( null === undefined ); // false +``` - ```js run - alert( null == undefined ); // true - ``` +สำหรับการตรวจสอบความเท่ากันแบบไม่เข้มงวดด้วย `==`: +: มีกฎพิเศษ ค่าทั้งสองนี้เป็น "คู่รักในฝัน" คือเท่ากันในแง่ของ `==` แต่ไม่เท่ากับค่าอื่นใด -**เปรียบเทียบแบบอื่นๆ `< > <= >=`** +```js run +alert( null == undefined ); // true +``` -`null` และ `undefined` จะถูกแปลงเป็นตัวเลข: `null` เป็น `0`, `undefined` เป็น `NaN` (Not a Number) +สำหรับการคำนวณทางคณิตศาสตร์และการเปรียบเทียบอื่นๆ `< > <= >=`: +: `null/undefined` จะถูกแปลงเป็นตัวเลข โดย `null` เป็น `0` และ `undefined` เป็น `NaN` -เดี๋ยวมาดูเรื่องตลกๆ ที่เกิดขึ้นจากกฎเหล่านี้กัน และที่สำคัญกว่านั้น เราจะไม่พลาดท่ากับกฎเหล่านี้อย่างไร +เรามาดูเหตุการณ์แปลกๆ ที่เกิดขึ้นเมื่อใช้กฎเหล่านี้ และที่สำคัญกว่านั้น คือเราจะหลีกเลี่ยงกับดักเหล่านี้ได้อย่างไร -### สับสนงงงวย: null vs 0 +### ผลลัพธ์ประหลาด: null เทียบกับ 0 -ลองเปรียบเทียบ `null` กับ 0 กัน: +ลองเปรียบเทียบ `null` กับศูนย์ดู: ```js run alert( null > 0 ); // (1) false alert( null == 0 ); // (2) false -alert( null >= 0 ); // (3) *!*true*/!* +alert( null >= 0 ); // (3) *!*true*/!* ``` -งงดิ! ผลลัพธ์สุดท้ายบอกว่า `null` มากกว่าหรือน้อยกว่าหรือเท่ากับ "0" ดังนั้นในการเปรียบเทียบข้างต้นอย่างน้อยหนึ่งข้อควรเป็น `true` แต่ดันเป็น `false` ทั้งคู่ +ทางคณิตศาสตร์แล้วมันแปลกมาก ผลลัพธ์สุดท้ายบอกว่า "`null` มากกว่าหรือเท่ากับศูนย์" ดังนั้นในการเปรียบเทียบข้างต้นต้องมีอย่างน้อยหนึ่งค่าเป็น `true` แต่กลับเป็น false ทั้งคู่ -สาเหตุคือการตรวจสอบความเท่าเทียม `==` และการเปรียบเทียบ `> < >= <=` ทำงานแตกต่างกัน การเปรียบเทียบจะแปลง `null` เป็นตัวเลข โดยพิจารณาว่าเป็น `0` นั่นคือเหตุผลที่ (3) `null >= 0` เป็น `true` และ (1) `null > 0` เป็น `false` +สาเหตุคือ การตรวจสอบความเท่ากันด้วย `==` และการเปรียบเทียบ `> < >= <=` ทำงานต่างกัน การเปรียบเทียบจะแปลง `null` เป็นตัวเลขและถือว่าเป็น `0` นั่นเป็นเหตุผลที่ (3) `null >= 0` เป็น true และ (1) `null > 0` เป็น false -ในทางกลับกัน การตรวจสอบความเท่าเทียม `==` สำหรับ `undefined` และ `null` ถูกกำหนดไว้ในลักษณะที่ ไม่ต้องแปลงใดๆ ก็เท่ากัน และไม่เท่ากับอะไรอื่น นั่นคือเหตุผลที่ (2) `null == 0` เป็น `false` +ในทางกลับกัน การตรวจสอบความเท่ากันด้วย `==` ระหว่าง `undefined` กับ `null` นั้นถูกกำหนดไว้ว่า หากไม่มีการแปลงประเภท มันจะเท่ากันเองเท่านั้นและไม่เท่ากับค่าอื่นใด นั่นเป็นเหตุผลที่ (2) `null == 0` เป็น false -## undefined จอมไม่เข้าใครออกใคร +### undefined ไม่สามารถเปรียบเทียบได้ -เจ้า `undefined` นี่มันไม่ชอบเปรียบเทียบกับใครเลยจริงๆ: +เราไม่ควรนำค่า `undefined` ไปเปรียบเทียบกับค่าอื่นๆ: ```js run alert( undefined > 0 ); // false (1) -alert( undefined < 0 ); // false (2) +alert( undefined < 0 ); // false (2) alert( undefined == 0 ); // false (3) ``` -ทำไมมันถึงไม่ชอบเลข 0 ขนาดนั้น? เจออะไรก็ `false` +ทำไม `undefined` ถึงเกลียดศูนย์ขนาดนั้น จนเป็น false ตลอด! -เหตุผลที่เราได้ผลลัพธ์เหล่านี้ก็คือ: +เพราะว่า: -- การเปรียบเทียบ `(1)` และ `(2)` ส่งคืน `false` เพราะ `undefined` ถูกแปลงเป็น `NaN` และ `NaN` เป็นค่าตัวเลขพิเศษที่ส่งคืน `false` สำหรับการเปรียบเทียบทั้งหมด -- การตรวจสอบความเท่าเทียม `(3)` ส่งคืน `false` เพราะ `undefined` เท่ากับ `null`, `undefined` และไม่มีค่าอื่นใด +- การเปรียบเทียบ `(1)` และ `(2)` ให้ค่า `false` เพราะ `undefined` ถูกแปลงเป็น `NaN` ซึ่ง `NaN` เป็นค่าตัวเลขพิเศษที่ให้ผลเป็น `false` เสมอเมื่อเปรียบเทียบ +- การตรวจสอบความเท่ากัน `(3)` ให้ค่า `false` เพราะ `undefined` จะเท่ากับ `null` และ `undefined` เท่านั้น ไม่เท่ากับค่าอื่น -## ข้อควรระวัง +### หลีกเลี่ยงปัญหา -เราเรียนรู้เรื่องพวกนี้ไปทำไม? เราต้องจำไว้ทุกอย่างเลยเหรอ? ไม่จำเป็นหรอก! ยิ่งใช้ JavaScript ไปเรื่อยๆ เดี๋ยวก็ชินกับความแปลกๆ เหล่านี้เอง แต่มีวิธีที่แน่นอนในการหลีกเลี่ยงปัญหา: +ทำไมเราถึงยกตัวอย่างเหล่านี้? เราจำเป็นต้องจำความพิเศษเหล่านี้ตลอดเวลาหรือ? ไม่จำเป็นหรอก จริงๆ แล้วสิ่งที่ดูยุ่งยากเหล่านี้จะค่อยๆ คุ้นเคยไปเองตามเวลา แต่มีวิธีที่ดีกว่าในการหลีกเลี่ยงปัญหาพวกนี้: -- ระมัดระวังเป็นพิเศษเมื่อเปรียบเทียบค่าอะไรก็ตามกับ `undefined/null` ยกเว้นการเปรียบเทียบแบบเข้มงวด `===` -- อย่าใช้การเปรียบเทียบ `>= > < <=` กับตัวแปรที่อาจเป็น `null/undefined` เว้นแต่คุณจะมั่นใจจริงๆ ว่าคุณกำลังทำอะไรอยู่ ถ้าตัวแปรอาจมีค่าเหล่านี้ ให้ตรวจสอบแยกต่างหาก +- ระมัดระวังเป็นพิเศษเมื่อเปรียบเทียบกับ `undefined/null` ยกเว้นการตรวจสอบความเท่ากันแบบเข้มงวดด้วย `===` +- อย่าใช้การเปรียบเทียบ `>= > < <=` กับตัวแปรที่อาจเป็น `null/undefined` เว้นแต่คุณจะมั่นใจว่าตัวเองกำลังทำอะไร ถ้าตัวแปรอาจมีค่าเหล่านี้ได้ ให้ตรวจสอบ `null/undefined` แยกต่างหาก ## สรุป -- ตัวดำเนินการเปรียบเทียบจะส่งคืนค่าบูลีน -- สตริงจะถูกเปรียบเทียบทีละตัวอักษรตามลำดับ "พจนานุกรม" -- เมื่อเปรียบเทียบค่าที่มีประเภทข้อมูลต่างกัน ค่าเหล่านั้นจะถูกแปลงเป็นตัวเลข (ยกเว้นการเปรียบเทียบแบบเข้มงวด) -- ค่า `null` และ `undefined` เท่ากัน `==` กันเองและไม่เท่ากับค่าอื่นใด -- ระมัดระวังเมื่อใช้การเปรียบเทียบ เช่น `>` หรือ `<` กับตัวแปรที่อาจเป็น `null/undefined` เป็นครั้งคราว การตรวจสอบ `null/undefined` แยกต่างหากเป็นแนวคิดที่ดี +- ตัวดำเนินการเปรียบเทียบให้ค่าเป็น boolean +- การเปรียบเทียบ string จะเปรียบเทียบทีละตัวอักษรตามลำดับ "พจนานุกรม" +- เมื่อเปรียบเทียบค่าต่างประเภทกัน ค่าจะถูกแปลงเป็นตัวเลข (ยกเว้นการตรวจสอบความเท่ากันอย่างเข้มงวด) +- ค่า `null` และ `undefined` เท่ากันเฉพาะเมื่อใช้ `==` และไม่เท่ากับค่าอื่นใดทั้งสิ้น +- ระมัดระวังเมื่อใช้การเปรียบเทียบ เช่น `>` หรือ `<` กับตัวแปรที่อาจเป็น `null/undefined` ได้ บางครั้งการตรวจสอบ `null/undefined` แยกต่างหากถือเป็นแนวทางที่ดี \ No newline at end of file