JavaScript | Pass By Value และ Pass By Reference ใน JavaScript
หนึ่งในหัวข้อที่สับสนที่สุดในการเขียนโปรแกรมคือการแยกแยะว่าตัวแปรถูกส่งผ่านโดยการอ้างอิงหรือด้วยค่า ใน JavaScript สิ่งต่าง ๆ แตกต่างกันเล็กน้อย ในบทความนี้ เราจะพิจารณาว่า pass by value และ pass by reference ใน Javascript
มาดูกันว่าอะไรคือค่าที่ผ่านและส่งต่อโดยการอ้างอิง ก่อนที่จะพิจารณาบริบทของจาวาสคริปต์
ผ่านตามมูลค่า:
ใน Pass by Value ฟังก์ชันจะถูกเรียกโดยการส่งผ่านค่าของตัวแปรโดยตรงเป็นอาร์กิวเมนต์ การเปลี่ยนอาร์กิวเมนต์ภายในฟังก์ชันจะไม่ส่งผลต่อตัวแปรที่ส่งผ่านจากภายนอกฟังก์ชัน
Javascript ส่งผ่านค่าเสมอ ดังนั้นการเปลี่ยนค่าของตัวแปรจะไม่เปลี่ยนค่าพื้นฐาน (สตริงหรือตัวเลข)
function callByValue(varOne, varTwo) { console.log('Inside Call by Value Method'); varOne = 100; varTwo = 200; console.log('varOne =' + varOne +'varTwo =' +varTwo); } let varOne = 10; let varTwo = 20; console.log('Before Call by Value Method'); console.log('varOne =' + varOne +'varTwo =' +varTwo); callByValue(varOne, varTwo) console.log('After Call by Value Method'); console.log('varOne =' + varOne +'varTwo =' +varTwo); output will be : --------------- Before Call by Value Method varOne =10 varTwo =20 Inside Call by Value Method varOne =100 varTwo =200 After Call by Value Method varOne =10 varTwo =20
อย่างไรก็ตาม เมื่อตัวแปรอ้างถึงอ็อบเจ็กต์ที่มีอาร์เรย์ ค่านั้นคือการอ้างอิงไปยังอ็อบเจ็กต์
ผ่านโดยอ้างอิง:
ใน Pass by Reference ฟังก์ชันจะถูกเรียกโดยการส่งผ่านการอ้างอิง/ที่อยู่ของตัวแปรโดยตรงเป็นอาร์กิวเมนต์ การเปลี่ยนอาร์กิวเมนต์ภายในฟังก์ชันจะส่งผลต่อตัวแปรที่ส่งผ่านจากภายนอกฟังก์ชัน ในวัตถุ Javascript และอาร์เรย์จะผ่านโดยการอ้างอิง
function callByReference(varObj) { console.log('Inside Call by Reference Method'); varObj.a = 100; console.log(varObj); } let varObj = {a:1}; console.log('Before Call by Reference Method'); console.log(varObj); callByReference(varObj) console.log('After Call by Reference Method'); console.log(varObj); output will be : --------------- Before Call by Reference Method {a: 1} Inside Call by Reference Method {a: 100} After Call by Reference Method {a: 100}
ดังนั้นหากเราส่งผ่านวัตถุหรืออาร์เรย์เป็นอาร์กิวเมนต์ไปยังวิธีการ ก็มีความเป็นไปได้ที่ค่าของวัตถุสามารถเปลี่ยนแปลงได้
เรียนรู้เพิ่มเติม
ขอบคุณที่อ่าน !
#javascript