บทสรุปของฉันของหนึ่งประโยค: ค่าดั้งเดิมจะไม่เปลี่ยนค่าดั้งเดิมไม่ว่าจะเป็นการกำหนดตัวแปรหรือการส่งผ่านฟังก์ชั่น ไม่ว่าจะเป็นการกำหนดตัวแปรหรือการส่งผ่านฟังก์ชันหากตัวแปรใหม่ถูกกำหนดใหม่มันจะไม่ส่งผลกระทบต่อค่าอ้างอิงดั้งเดิม หากตัวแปรใหม่เป็นการดำเนินการโดยตรงมันจะส่งผลกระทบต่อค่าอ้างอิงดั้งเดิม
ก่อนอื่นเป็นที่ชัดเจนว่าค่าและประเภทเป็นแนวคิดสองแนวคิดที่แตกต่างกัน ตัวอย่างเช่น NULL เป็นค่าที่ไม่ซ้ำกันของประเภท null ที่ไม่ได้กำหนดเป็นค่าที่ไม่ซ้ำกันของประเภทที่ไม่ได้กำหนดและจริงและเท็จเป็นเพียงสองค่าของประเภทบูลีน ฯลฯ ในภาษาใด ๆ การดำเนินการของค่าสามารถสรุปได้ใน 3 ด้านต่อไปนี้
ค่าคัดลอก: นั่นคือกำหนดค่าให้กับตัวแปรใหม่หรือกำหนดค่าให้กับตัวแปรอื่นแอตทริบิวต์หรือองค์ประกอบอาร์เรย์ผ่านตัวแปร
ค่าผ่าน: นั่นคือการส่งผ่านค่าเป็นพารามิเตอร์ไปยังฟังก์ชันหรือวิธีการ
เปรียบเทียบค่า: นั่นคือเปรียบเทียบค่ากับค่าอื่นเพื่อดูว่ามันเท่ากันหรือไม่
เนื่องจากค่าของข้อมูลประเภทค่าและข้อมูลอ้างอิงมีรูปแบบที่แตกต่างกันวิธีการทำงานตามธรรมชาติและผลลัพธ์ที่ผลิตก็แตกต่างกันเช่นกัน โปรดทราบว่าเมื่อค่าเป็นข้อมูลประเภทค่าเรามักจะเรียกมันว่าค่าดั้งเดิมหรือค่าพื้นฐาน เมื่อค่าอ้างอิงเรามักจะเรียกมันว่าค่าอ้างอิงหรือค่าคอมโพสิต
1. ใช้ค่าดั้งเดิม
สำหรับค่าดั้งเดิมการดำเนินการทั้งสามระดับได้รับการอธิบายดังนี้
1) คัดลอกค่า
ในคำสั่งการกำหนดกระบวนการดำเนินการจะสร้างสำเนาของค่าจริง ไม่มีการเชื่อมต่อระหว่างค่าของการคัดลอกและค่าจริง พวกเขาตั้งอยู่ในพื้นที่สแต็กที่แตกต่างกันหรือพื้นที่กองเพียงอย่างเดียว สำเนานี้สามารถจัดเก็บตัวแปรคุณสมบัติของวัตถุและองค์ประกอบอาร์เรย์ ตัวอย่างเช่น:
var n = 123, a, b = [], c = {}; a = n; // คัดลอกหมายเลข 123 b [0] = n; // คัดลอกหมายเลข 123 cx = n; // คัดลอกหมายเลข 123 (a == b [0]) && (a == cx) && (b [0] == cx) && แจ้งเตือน ("ค่าที่คัดลอกมีค่าเท่ากับ"); // ตรวจจับว่าค่าของพวกเขาเท่ากันในตัวอย่างข้างต้นค่า 123 ถูกคัดลอก 3 สำเนาไปยังตัวแปร A, อาร์เรย์ B และวัตถุ C ตามลำดับ แม้ว่าค่าของพวกเขาจะเท่ากัน แต่ก็เป็นอิสระจากกัน
2) ผ่านค่า
เมื่อผ่านค่าไปยังฟังก์ชันหรือวิธีการค่าที่ผ่านเป็นเพียงสำเนาไม่ใช่ค่าของตัวเอง ตัวอย่างเช่นหากคุณแก้ไขค่าที่ผ่านในฟังก์ชันผลลัพธ์สามารถส่งผลกระทบต่อสำเนาของค่าพารามิเตอร์นี้เท่านั้นและจะไม่ส่งผลกระทบต่อค่าดั้งเดิม
var a = 123; // ฟังก์ชันค่าดั้งเดิม f (x) {x = x + x; } f (a); // เรียกฟังก์ชันเพื่อแก้ไขการแจ้งเตือนค่าที่ผ่าน (a); // ตรวจสอบว่าค่าของตัวแปร A ได้รับผลกระทบหรือไม่ ค่าส่งคืนคือ 123 แสดงว่าไม่มีการเปลี่ยนแปลง3) ค่าเปรียบเทียบ
ในตัวอย่างข้างต้นเรายังสามารถเห็นได้ว่าเมื่อเปรียบเทียบค่าดั้งเดิมการเปรียบเทียบไบต์ไบต์จะดำเนินการเพื่อตรวจสอบว่าพวกเขามีค่าเท่ากันหรือไม่ การเปรียบเทียบค่าเองไม่ใช่ตำแหน่งที่ค่าเป็น แม้ว่าผลลัพธ์ของการเปรียบเทียบอาจเท่ากัน แต่ก็หมายความว่าข้อมูลไบต์ที่มีอยู่นั้นเหมือนกัน
2. ใช้ค่าอ้างอิง
สำหรับค่าอ้างอิงสามระดับของการดำเนินการของพวกเขามีดังนี้
1) คัดลอกค่า
ในคำสั่งที่ได้รับมอบหมายค่าที่กำหนดคือการอ้างอิงถึงค่าดั้งเดิมไม่ใช่การคัดลอกค่าดั้งเดิมหรือค่าดั้งเดิมเอง กล่าวคือหลังจากดำเนินการกำหนดตัวแปรจะบันทึกการอ้างอิงถึงค่าดั้งเดิม (นั่นคือที่อยู่ที่เก็บของค่าดั้งเดิม) เมื่อคัดลอกระหว่างตัวแปรหลายตัวองค์ประกอบอาร์เรย์หรือคุณสมบัติของวัตถุพวกเขาทั้งหมดจะเหมือนกันกับการอ้างอิงที่บันทึกโดยตัวแปรดั้งเดิม
การอ้างอิงทั้งหมดมีเอฟเฟกต์และฟังก์ชั่นเดียวกันและสามารถทำได้ หากข้อมูลได้รับการแก้ไขผ่านการอ้างอิงอย่างใดอย่างหนึ่งการปรับเปลี่ยนนี้จะสะท้อนให้เห็นในค่าดั้งเดิมและการอ้างอิงอื่น ๆ ที่เกี่ยวข้อง ตัวอย่างเช่น:
var a = [1,2,3]; // กำหนดอาร์เรย์อ้างอิง b = a; // คัดลอกค่า b [0] = 4; // แก้ไขค่าขององค์ประกอบแรกในการแจ้งเตือนตัวแปร B (A [0]); // return 4 แสดงให้เห็นว่าค่าขององค์ประกอบแรกในตัวแปร A ยังถูกปรับเปลี่ยนเป็น 4
อย่างไรก็ตามหากค่าใหม่ถูกกำหนดใหม่ให้กับตัวแปร B ค่าใหม่จะไม่ส่งผลกระทบต่อเนื้อหาของค่าดั้งเดิม ตัวอย่างเช่น:
var a = [1,2,3]; // กำหนดอาร์เรย์อ้างอิง b = a; // คัดลอกค่า b = 4; // เขียนทับการแจ้งเตือนการกำหนด (A [0]); // เนื้อหาของตัวแปร A ยังคงไม่เปลี่ยนแปลง
การมอบหมายซ้ำ ๆ กำลังเอาชนะการอ้างอิงของตัวแปรเกี่ยวกับค่าดั้งเดิมกลายเป็นสำเนาของค่าอื่นหรือการอ้างอิงถึงมัน ดังนั้นมันจะไม่ส่งผลกระทบต่อค่าดั้งเดิมและแผนภาพการสาธิตจะแสดงในรูปที่ 4-2
2) ผ่านค่า
เมื่อใช้การอ้างอิงเพื่อส่งผ่านข้อมูลไปยังฟังก์ชั่นการส่งผ่านไปยังฟังก์ชั่นก็เป็นการอ้างอิงถึงค่าดั้งเดิม ฟังก์ชั่นสามารถใช้การอ้างอิงนี้เพื่อแก้ไขค่าดั้งเดิมเองและการปรับเปลี่ยนใด ๆ สามารถมองเห็นได้นอกฟังก์ชั่น ตัวอย่างเช่น:
var a = [1,2,3]; ฟังก์ชั่น f (x) {x [0] = 4; // แก้ไขค่าพารามิเตอร์ในฟังก์ชัน} f (a); // ผ่านการแจ้งเตือนค่าอ้างอิง (A [0]); // return 4 ค่าดั้งเดิมเปลี่ยนไปโปรดทราบว่าสิ่งที่ได้รับการแก้ไขภายในฟังก์ชั่นเป็นการอ้างอิงถึงวัตถุภายนอกหรืออาร์เรย์ไม่ใช่ค่าของวัตถุหรืออาร์เรย์เอง คุณสามารถใช้การอ้างอิงเพื่อแก้ไขแอตทริบิวต์ของวัตถุหรือองค์ประกอบของอาร์เรย์ภายในฟังก์ชั่น แต่หากมีการใช้การอ้างอิงใหม่ภายในฟังก์ชั่นเพื่อเขียนทับการอ้างอิงดั้งเดิมแล้วการปรับเปลี่ยนภายในฟังก์ชั่นจะไม่ส่งผลกระทบต่อค่าของการอ้างอิงดั้งเดิมและไม่สามารถมองเห็นได้นอกฟังก์ชั่น
var a = [1,2,3]; ฟังก์ชั่น f (x) {x = 4; // แก้ไขค่าพารามิเตอร์ในฟังก์ชัน} f (a); // ผ่านการแจ้งเตือนค่าอ้างอิง (A [0]); // return 1 ค่าดั้งเดิมจะไม่เปลี่ยนแปลง3) ค่าเปรียบเทียบ
เมื่อเปรียบเทียบค่าอ้างอิงสองค่าที่อยู่อ้างอิงทั้งสองจะถูกนำมาเปรียบเทียบเพื่อดูว่าค่าดั้งเดิมที่พวกเขาอ้างอิงเป็นสำเนาเดียวกันหรือไม่แทนที่จะเป็นค่าดั้งเดิมของพวกเขาคือไบต์เท่ากับ เมื่ออ้างอิงสองค่าที่แตกต่างกันแม้ว่าพวกเขาจะมีองค์ประกอบไบต์เดียวกันค่าของการอ้างอิงทั้งสองจะไม่เท่ากัน
var a = หมายเลขใหม่ (1); // ค่าอ้างอิง a var b = หมายเลขใหม่ (1); // ค่าอ้างอิง b var c = a; // กำหนดการอ้างอิงถึงการแจ้งเตือน c (a == b); // ส่งคืนการแจ้งเตือนเท็จ (a == c); // return true
ดังนั้น {} == {}, [] == [], ทั้งหมดกลับมาเป็นเท็จ เพราะที่อยู่อ้างอิงแตกต่างกัน
ในระยะสั้นสำหรับภาษาใด ๆ การใช้ค่าและการใช้การอ้างอิงเป็นสองวิธีพื้นฐานของการจัดการข้อมูล เมื่อเราใช้งานข้อมูลควรใช้วิธีใดในการประมวลผลส่วนใหญ่ขึ้นอยู่กับประเภทของข้อมูล ประเภทค่าและข้อมูลอ้างอิงมีส่วนร่วมในการดำเนินการแตกต่างกัน ข้อมูลประเภทค่าทำงานบนข้อมูลโดยใช้ค่าในขณะที่ข้อมูลอ้างอิงทำงานบนข้อมูลโดยใช้การอ้างอิง วิธีการคำนวณที่แตกต่างกันยังให้ผลลัพธ์ที่แตกต่างกันตามธรรมชาติ ลองมาดูตัวอย่างอื่น:
var s = "abc"; // string, ประเภทค่าข้อมูล var o = สตริงใหม่ (S); // วัตถุสตริงฟังก์ชั่นสตริงกล่อง f (v) {// ฟังก์ชันการทำงาน v.toString = function () {// เมธอด toString toString () ส่งคืน 123; - } f (s); // ผ่านการแจ้งเตือนค่า; // ส่งคืนสตริง "ABC" ซึ่งระบุว่าการดำเนินการไม่ได้ส่งผลกระทบต่อข้อมูลดั้งเดิม f (O); // ผ่านการแจ้งเตือนอ้างอิง (O); // ส่งคืนค่า 123 แสดงว่าการดำเนินการส่งผลกระทบต่อโครงสร้างภายในของข้อมูลต้นฉบับประเภทค่ามีส่วนร่วมในการดำเนินการด้วยค่าจริงดังนั้นจึงไม่มีการเชื่อมต่อโดยตรงกับข้อมูลดั้งเดิม ประเภทการอ้างอิงมีส่วนร่วมในการดำเนินการด้วยที่อยู่อ้างอิงและผลการคำนวณจะส่งผลกระทบต่อบล็อกข้อมูลพื้นที่ฮีปที่เกี่ยวข้องกับที่อยู่อ้างอิง อย่างไรก็ตามมีข้อยกเว้นหนึ่งข้อ สำหรับสตริง JavaScript วิธีการใช้งานนั้นค่อนข้างซับซ้อน กรุณาให้ Google สำหรับรายละเอียด!
บทความด้านบน JavaScript Data Operation_a การอภิปรายสั้น ๆ เกี่ยวกับสาระสำคัญของการดำเนินการของค่าดั้งเดิมและค่าอ้างอิงเป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น