Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

JavaScript :เหตุใดตัวดำเนินการ % จึงทำงานบนสตริง - (แบบบังคับ)


สมมติว่าเรามีข้อมูลโค้ดที่ให้ผลลัพธ์ที่น่าตกใจ ประการแรก เราเห็นว่าโมดูโลโอเปอเรเตอร์ทำงานได้ดีกับสตริงเช่นกัน (น่าประหลาดใจ) ประการที่สอง การต่อกันของสองสตริงทำให้เกิดผลลัพธ์ที่น่าอึดอัดใจ

เราต้องอธิบายว่าทำไม 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