วันนี้ฉันตอบคำถามเกี่ยวกับ JavaScript ซึ่งเกี่ยวข้องกับปัญหาการมอบหมายดังนั้นฉันต้องการสรุปปัญหานี้อย่างรอบคอบ
การคัดลอกรหัสมีดังนี้:
var a = 'ทดสอบ';
var b = function () {};
ba = 'ทดสอบ';
การเปลี่ยนแปลงฟังก์ชั่น (M, N) {
m = 'เปลี่ยน';
Na = 'Change';
-
เปลี่ยน (a, b);
ค่าตัวแปร A และ B จะเปลี่ยนไปหลังจากดำเนินการรหัสด้านบนหรือไม่
ค่าดั้งเดิมและค่าอ้างอิง
ฉันได้แนะนำค่าดั้งเดิมและค่าอ้างอิงในบทความก่อนหน้า ค่าดั้งเดิมหมายถึง undefined, null, boolean, จำนวน, สตริง ฯลฯ ซึ่งเก็บไว้ในสแต็กในขณะที่ค่าอ้างอิงถูกรวมเข้าด้วยกันจากวัตถุซึ่งเก็บไว้ในกอง
ที่นี่เราต้องแยกความแตกต่างทั้งสอง:
การคัดลอกรหัสมีดังนี้:
var a = 'ทดสอบ';
var b = สตริงใหม่ ('ทดสอบ');
var a = 'true';
var b = บูลีนใหม่ ('จริง');
สำหรับตัวแปรสี่ตัวข้างต้น A และ A เป็นค่าดั้งเดิมในขณะที่ B และ B เป็นค่าอ้างอิง
กลไกการกำหนด
หลังจากชี้แจงความแตกต่างระหว่างค่าดั้งเดิมและค่าอ้างอิงคุณสามารถแนะนำกลไกการกำหนด JavaScript ในรายละเอียด:
ใน JavaScript การมอบหมายแต่ละครั้งจะสร้างสำเนาสำหรับตัวแปรประเภทค่าดั้งเดิมและสำหรับค่าอ้างอิงตามชื่อของมันจะถูกกำหนดโดยการอ้างอิงถึงหน่วยความจำของวัตถุจัดเก็บข้อมูลเดียวกัน
การกำหนดค่าดั้งเดิม:
การคัดลอกรหัสมีดังนี้:
var a = 1; // ค่าดั้งเดิม
var b = a; // สร้างสำเนาไปยังตัวแปร b
b = 2; // ไม่เกี่ยวข้องกับก
การแจ้งเตือน (a); // output 1
การกำหนดค่าอ้างอิง:
การคัดลอกรหัสมีดังนี้:
var a = วัตถุใหม่ (); // ค่าอ้างอิง
ขวาน = 1;
var b = a; // การกำหนดอ้างอิงชี้ไปที่หน่วยความจำเดียวกัน
bx = 2; // การดัดแปลง B จะส่งผลกระทบ
การแจ้งเตือน (ขวาน); // เอาท์พุท 2
พารามิเตอร์ผ่าน
ตอนนี้ลองมาดูวิธีจัดการผ่านค่าสองประเภทไปยังพารามิเตอร์ฟังก์ชันในเวลาเดียวกัน
1. ผ่านค่าดั้งเดิม
การคัดลอกรหัสมีดังนี้:
var a = 1;
การทดสอบฟังก์ชั่น (M) {
M = 2;
-
ทดสอบ (a);
การแจ้งเตือน (a); // output 1
เอาต์พุตคือ 1 ดังนั้นเราจึงรู้ว่าฟังก์ชั่นเพียงผ่านค่าของตัวแปรในดังนั้น m ในตัวฟังก์ชั่นจะได้รับค่า 1 และถูกกำหนดให้ 2 กระบวนการนี้ไม่ส่งผลกระทบต่อตัวแปรภายนอก
2. ผ่านค่าอ้างอิง
การคัดลอกรหัสมีดังนี้:
var a = วัตถุใหม่ ();
ขวาน = 1
การทดสอบฟังก์ชั่น (M) {
mx = 2;
-
ทดสอบ (a);
การแจ้งเตือน (ขวาน); // เอาท์พุท 2
เอาต์พุตคือ 2 ดังนั้นเราจึงรู้ว่าฟังก์ชั่นส่งผ่านที่อยู่ของตัวแปรในดังนั้น m ในตัวฟังก์ชั่นจะได้รับที่อยู่ที่ผ่าน ดังนั้นเมื่อแอตทริบิวต์ x ถูกกำหนดให้ 2 มันจะส่งผลกระทบต่อการชี้ไปยังที่อยู่หน่วยความจำเดียวกัน
สรุป
ตอนนี้กลับไปที่คำถามเปิด:
การคัดลอกรหัสมีดังนี้:
var a = 'ทดสอบ';
var b = function () {};
ba = 'ทดสอบ';
การเปลี่ยนแปลงฟังก์ชั่น (M, N) {
m = 'เปลี่ยน';
Na = 'Change';
-
เปลี่ยน (a, b);
ตัวแปร A คือค่าดั้งเดิมตัวแปร B คือค่าอ้างอิงและหนึ่งจะถูกส่งผ่านเข้าไปในร่างกายฟังก์ชั่นเป็นค่าและอื่น ๆ คือที่อยู่ดังนั้นหลังจากการทำงานของฟังก์ชั่นตัวแปร A จะไม่เปลี่ยนแปลงและค่าของตัวแปร B จะเปลี่ยนไป