1. ส่งผ่านตามค่า (ตามค่า)
ค่าของตัวแปรจะถูกคัดลอกและจะไม่เกี่ยวข้องกับค่าดั้งเดิม กล่าวคือ แม้ว่าค่าใหม่จะถูกแก้ไข แต่ค่าดั้งเดิมจะไม่เปลี่ยนแปลง ใน JavaScript ประเภทพื้นฐานจะถูกส่งผ่านตามค่า
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่น testPassValue()
-
วาร์ ม=1;
วาร์ n=2;
//คัดลอกค่าของ m และ n แล้วส่งต่อไปยัง passValue
ค่าผ่าน(m,n);
alert(m); //จะเป็นค่าเดิม
-
ฟังก์ชั่น passValue (a, b)
-
a = a+b; // เปลี่ยนค่าของ a ที่นี่ a เป็นเพียงสำเนาของค่าดั้งเดิม
การแจ้งเตือน (ก);
-
ผลลัพธ์ที่ได้:
3
1
2. โดยการอ้างอิง
สำเนาของการอ้างอิงจะถูกส่งผ่านไปยังฟังก์ชัน วัตถุที่อ้างอิงถึงจะไม่ถูกคัดลอกและส่งผ่าน (เช่นเดียวกับใน Java) ในฟังก์ชันหากค่าของแอตทริบิวต์ของวัตถุมีการเปลี่ยนแปลงตั้งแต่ต้นฉบับ จุดอ้างอิงไปยังวัตถุเดียวกัน ดังนั้น ค่าที่แก้ไขจะสามารถเข้าถึงได้ผ่านการอ้างอิงดั้งเดิม
แต่ถ้าคุณเพียงชี้การอ้างอิงไปยังวัตถุใหม่ในฟังก์ชัน ค่าของวัตถุต้นฉบับจะไม่เปลี่ยนแปลง เฉพาะการอ้างอิงที่คัดลอกเท่านั้นที่จะถูกเปลี่ยน
คัดลอกรหัสรหัสดังต่อไปนี้:
ฟังก์ชั่น testPassValue()
-
วันที่ var = วันที่ใหม่ (2549,02,27);
alert(date.getDate()); //ผลลัพธ์คือ 27
//คัดลอกการอ้างอิงวันที่และส่งผ่านไปยัง passReference โปรดทราบว่ายังไม่ได้คัดลอกวัตถุที่ชี้ตามวันที่
passReference (วันที่);
alert(date.getDate()); //ผลลัพธ์คือ 12
//เหมือนข้างบน.
changeReference (วันที่);
alert(date.getDate()); //ผลลัพธ์ยังคงเป็น 12
-
ฟังก์ชั่น passReference (ดา)
-
//เนื่องจาก da และการอ้างอิงดั้งเดิมชี้ไปที่ออบเจ็กต์เดียวกัน ภายนอกฟังก์ชัน สิ่งที่เข้าถึงได้ผ่านการอ้างอิงดั้งเดิมจะเป็นค่าแอตทริบิวต์ date ของออบเจ็กต์ ซึ่งจะเป็นค่าที่แก้ไข
da.setDate(12);
-
ฟังก์ชั่น changeReference(da)
-
//ในขณะนี้ การอ้างอิง da เป็นสำเนาของการอ้างอิงต้นฉบับ การกำหนดการอ้างอิงใหม่จะไม่ส่งผลต่อการอ้างอิงต้นฉบับ
ดา = วันที่ใหม่ (2550,05,11);
//ชี้การอ้างอิงดาไปยังวัตถุใหม่ ในขณะนี้ การอ้างอิงต้นฉบับยังคงชี้ไปที่วัตถุต้นฉบับ
alert(da.getDate()); // ผลลัพธ์คือ 11
-
3 สายพิเศษ
ใน JavaScript นั้น String จะถูกส่งผ่านโดยการอ้างอิง มีเพียงเมธอด charAt ใน js แต่ไม่มีวิธีการแก้ไขที่สอดคล้องกัน มันเหมือนกับ String ใน java และไม่มีการเปลี่ยนแปลง
คัดลอกรหัสรหัสดังต่อไปนี้:
var s1 = "สวัสดี";
var s2 = "นรก" + "o";
ถ้า (s1 == s2)
alert("s1 = s2"); // ประโยคนี้จะถูกประหารชีวิตหรือไม่ คนที่คุ้นเคยกับ java อาจจะคิดว่ามันจะไม่ถูกประหารชีวิต (ฉันค่อนข้างวิพากษ์วิจารณ์ประโยคนี้, มันถูกประหารชีวิตด้วย java!) เพราะ ใน java == เปรียบเทียบเอกลักษณ์ จริงๆ แล้วใน js นั้น String== เปรียบเทียบว่าค่าเท่ากันหรือไม่ ดังนั้นประโยคนี้จะถูกดำเนินการ แต่สำหรับการเปรียบเทียบ Object == อื่นๆ ก็เหมือนกับใน Java