สมมติว่าเรามีข้อมูลโค้ดที่ให้ผลลัพธ์ที่น่าตกใจ ประการแรก เราเห็นว่าโมดูโลโอเปอเรเตอร์ทำงานได้ดีกับสตริงเช่นกัน (น่าประหลาดใจ) ประการที่สอง การต่อกันของสองสตริงทำให้เกิดผลลัพธ์ที่น่าอึดอัดใจ
เราต้องอธิบายว่าทำไม JavaScript ถึงทำเช่นนั้น
นี่คือรหัสปัญหา -
ตัวอย่าง
const numStr = '127'; const result = numStr % 5; const firstName = 'Armaan'; const lastName = 'Malik'; const fullName = firstName + + lastName; console.log('modulo result: ', result); console.log('full name: ', fullName);
ผลลัพธ์
modulo result: 2 full name: ArmaanNaN
ก่อนเข้าสู่โค้ด เรามาเรียนรู้เกี่ยวกับหัวข้อพื้นฐานที่สำคัญที่สุดอย่างหนึ่งของ JavaScript → Type Coercion กันก่อน
ประเภทบังคับ
โดยพื้นฐานแล้ว type coercion เป็นวิธีที่คอมไพเลอร์ JavaScript ใช้เพื่อเปลี่ยนประเภทข้อมูลหนึ่งเป็นอีกประเภทหนึ่ง ตัวอย่างของการบังคับประเภทที่ถูกต้องจะเปลี่ยน string เป็น boolean, number เป็น string และอื่นๆ
Type coercion เป็นหัวข้อที่กว้างใหญ่มากและเพื่อจำกัดความยาวของโซลูชันนี้ เราจะสำรวจเฉพาะสิ่งที่ใช้ในข้อมูลโค้ดนี้เท่านั้น จากประเภทการบีบบังคับสองประเภท ประเภทที่คอมไพเลอร์ทำโดยอัตโนมัติเรียกว่าการบีบบังคับแบบปริยาย
มันเป็นไปตาม −
ประเภทข้อมูลใดๆ (ดั้งเดิมหรือไม่ใช่แบบพื้นฐาน) จะถูกบังคับโดยปริยายถึง -
-
สตริง (เมื่อใช้กับตัวดำเนินการไบนารี +)
-
ตัวเลข (เมื่อใช้กับตัวดำเนินการเลขคณิต เช่น +, -, /, *,% และเฉพาะตัว +ทริกเกอร์เท่านั้น
การบังคับตัวเลขไม่ใช่เลขฐานสอง + เมื่อใช้กับตัวดำเนินการเปรียบเทียบ ตัวดำเนินการระดับบิตหรือตัวดำเนินการความเท่าเทียมกัน[==])
-
บูลีน (เมื่อใช้กับตัวดำเนินการเชิงตรรกะ &| ! )
***สิ่งที่ควรทราบอีกประการหนึ่งคือ ลำดับความสำคัญของตัวดำเนินการ unary (+) นั้นสูงกว่าตัวดำเนินการไบนารี (+)
คำอธิบายโค้ด
ดังนั้น เมื่อชัดเจนแล้ว ให้ย้ายไปที่โค้ดแล้วไปทีละบรรทัด −
Line 2 → result = '127' % 5;
การบีบบังคับโดยนัยจะเข้ามาและเห็นตัวดำเนินการ % เนื่องจากมันแปลงสตริง '127' เป็นหมายเลข 127 และ 2 ถูกเก็บไว้ในผลลัพธ์ -
Line 5 → fullName = firstName + + lastName;
fullName = firstName + (+lastName);
ในหลักสูตรปกติ การคำนวณจะเกิดขึ้นจากซ้ายไปขวา แต่เนื่องจากลำดับความสำคัญของโอเปอเรเตอร์เอก มันถูกคำนวณเป็น Number ก่อนและการดำเนินการจะกลายเป็นเช่นนี้ -
fullName = firstName + NaN;
แล้วก็
fullName = ArmaanNaN