Detaillierte Erläuterung der JS-Übertragung und des Kopierens
Wir wissen, dass es in js mehrere grundlegende Datentypen und andere komplexe Datentypen gibt, darunter (Objekte, Arrays, Funktionen). Wir nennen es eine Wertübertragung und danach eine Variable Zuweisung Es gibt keine andere Beziehung zur ursprünglichen Variablen, außer dass der Wert gleich ist.
let x = 666 let y = x let m = 'abc' let n = m y = 888 n = 'def' console.log(x, y)//666,888 console.log(m, n)//'abc','def'
Die Übertragung komplexer Datentypen ist nicht so, denn wenn eine Variable an einen komplexen Datentyp gebunden ist, wird nicht der Wert der komplexen Daten aufgezeichnet, sondern die Speicherung der Daten Eine Adressinformation: Wenn diese Variable einer anderen Variablen zugewiesen wird, werden nur die beiden Variablen auf eine Dateninformation übertragen. Diese Übertragungsmethode wird als „Pass By“ bezeichnet Referenz
let obj1 = { a : '1', b : 2 } let obj2 = obj1 obj2.b = 3 console.log(obj1,obj2)//{a: "1", b: 3},{a: "1", b: 3}
kopieren
Wir wissen, dass die Zuweisung komplexer Datentypen durch Referenz erfolgt und die Variablen vor und nach der Zuweisung sich in tatsächlichen Projekten häufig gegenseitig beeinflussen Wir wollen das zum Beispiel nicht:
Wir verwenden Daten (ein Array) an zwei Stellen in einer Ansicht. Zum einen muss eine Liste die Daten nur der Reihe nach anzeigen, und zum anderen muss a Diagramm erfordert Nach dem Umkehren der Daten und der anschließenden Datenverarbeitung tritt ein Problem auf. Wenn die erste Liste nach data.reverse() ebenfalls in umgekehrter Reihenfolge vorliegt, ist dies nicht das, was wir wollen. Wir benötigen eine Methode, um nur den Wert zu kopieren des Arrays. Und die Datenadresse dieses neuen Arrays unterscheidet sich von der des ursprünglichen Arrays. Diese Kopiermethode wird als Array-Kopie bezeichnet.
let obj1 = {a:1, b:{c:2}} let shallowCopy = (src)=> { let dst = {} for (let prop in src) { if (src.hasOwnProperty(prop)) { dst[prop] = src[prop] } } return dst } let obj2 = shallowCopy(obj1) console.log(obj1,obj2) //@1 obj1.a = 6 console.log(obj2.a) //@2 obj2.b.c = 666 console.log(obj1.b.c) //@3 obj2.b = { c: 888 } console.log(obj1.b.c) //@4
Aus dem obigen Beispiel ist ersichtlich, dass das Attribut der ersten Ebene von obj1 den Attributwert kopiert und die Kopie der Adresse nicht erbt, die zweite Ebene jedoch darin besteht, dass das Attribut b a gemeinsam nutzt Speicheradresse, die eine flache Kopie ist, aber bei @4 obj1 nicht von obj2 betroffen ist, da das Attribut b ein Objekt ist. Für diese Art der Neuzuweisung durch Referenz weist der Computer einen neuen Speicher zum Speichern von Daten und Aufzeichnungen zu Adressinformationen, daher sind obj1.b.c und obj2.b.c zu diesem Zeitpunkt keine Attributwerte des Datensatzes mehr.
kann auch so verstanden werden: Das Kopieren dient der Übertragung. Die direkte Zuweisung komplexer Datentypen erfolgt durch Referenz und kann nicht als Kopieren bezeichnet werden. Die Speicheradresseninformationen der Daten sind nicht genau gleich. Dies liegt daran, dass die Kopie auch in flache Kopie und tiefe Kopie unterteilt ist.
Eine nicht verschachtelte Kopie eines komplexen Datentyps bedeutet, dass nur die erste Datenschicht kopiert wird, bei der es sich um eine flache Kopie handelt. Wenn die erste Datenschicht einen komplexen Datentyp hat, wird sie trotzdem übergeben per Referenz werden immer noch die Adressinformationen kopiert, und die durch andere Methoden implementierte mehrschichtige verschachtelte Kopie von Array-Objekten ist eine tiefe Kopie.
Sehen wir uns an, wie Arrays und Objekte tiefe und flache Kopien implementieren:
Kopieren von Arrays
Slice-Methode
let arr1 = [1,2,[3,4]] let arr2 = arr1.slice(0) arr2[2].push(5) arr2.push(6) console.log(arr1,arr2)
Nach dem Login kopierenConcat-Methode
let arr1 = [1,2,[3,4]] let arr2 = arr1.concat() arr2[2].push(5) arr2.push(6) console.log(arr1,arr2)
Nach dem Login kopierenfor-Schleife
let arr1 = [1,2,[3,4]] let arr2 = [] for(let i = 0; i<arr1.length; i++){ arr2.push(arr1[i]) } arr2[2].push(5) arr2.push(6) console.log(arr1,arr2)
Nach dem Login kopieren…Operator
let arr1 = [1,2,[3,4]] let [...arr2] = arr1 arr2[2].push(5) arr2.push(6) console.log(arr1,arr2)
Nach dem Login kopieren
Die Kopien der oben genannten vier Arten von Arrays sind alle flache Kopien. Um die tiefe Kopie des Arrays zu realisieren, muss sie rekursiv implementiert werden
let deepClone = (src)=> { let result (src instanceof Array) ? (result = []) :(result = {}) for (let key in src) { result[key] = (typeof src[key] === 'object') ? deepClone(src[key]) : src[key]//数组和对象的type都是object } return result } let arr1 = [1,2,[3,4]] let arr2 = deepClone(arr1) arr2[2].push(5) arr2.push(6) console.log(arr1,arr2)
Sie können finden die Methode arr1[2] Im Gegensatz zu arr2[2] ist dieselbe Deep-Copy-Methode oben auch auf die Kopie des Objekts
Objekt
universelle for-Schleife <🎜 anwendbar >
let obj1 = {a:1,b:{c:2}} let obj2 = {} for(let key in obj1){ obj2[key] = obj1[key] } obj1.b.c = 6 console.log(obj1,obj2)
Nach dem Login kopieren- …Operator
let obj1 = {a:1,b:{c:2}} let {...obj2} = obj1 obj1.b.c = 6 console.log(obj1,obj2)
Nach dem Login kopieren - Object.assign()
let obj1 = {a:1,b:{c:2}} let obj2 = Object.assign({},obj1) obj1.b.c = 6 console.log(obj1,obj2)
Nach dem Login kopieren
- in einen String konvertieren und dann zurück in ein Objekt
let obj1 = {a:1,b:{c:2}} let obj2 = JSON.parse(JSON.stringify(obj1)) obj1.b.c = 6 console.log(obj1,obj2)
Nach dem Login kopieren - Die deepClone-Methode ist die deepClone-Methode des obigen Arrays
let pureFunc = (animal)=> { let newAnimal = JSON.parse(JSON.stringify(animal)) newAnimal.type = 'cat' newAnimal.name = 'Miao' return newAnimal } let wang = { type: 'dog', name: 'Wang' } let miao = pureFunc(wang) console.log(wang,miao)
let afterChange = (obj)=>{ obj.a = 6 obj = { a: 8, b: 9 } return obj } let objIns = { a: 1, b: 2 } let objIns2 = afterChange(objIns) console.log(objIns, objIns2)
JS-Funktion, die Parameter nach Wert übergibt
JavaScript-Parameterübergabe-Illustrations-Tutorial
Eine kurze Analyse der JSON-Übertragung in PHP und JS
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der JS-Übertragung und des Kopierens. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Das Windows-Betriebssystem ist eines der beliebtesten Betriebssysteme der Welt und seine neue Version Win11 hat viel Aufmerksamkeit erregt. Im Win11-System ist die Erlangung von Administratorrechten ein wichtiger Vorgang. Mit Administratorrechten können Benutzer weitere Vorgänge und Einstellungen auf dem System durchführen. In diesem Artikel wird ausführlich beschrieben, wie Sie Administratorrechte im Win11-System erhalten und wie Sie Berechtigungen effektiv verwalten. Im Win11-System werden Administratorrechte in zwei Typen unterteilt: lokaler Administrator und Domänenadministrator. Ein lokaler Administrator verfügt über vollständige Administratorrechte für den lokalen Computer

Detaillierte Erläuterung der Divisionsoperation in OracleSQL In OracleSQL ist die Divisionsoperation eine häufige und wichtige mathematische Operation, die zur Berechnung des Ergebnisses der Division zweier Zahlen verwendet wird. Division wird häufig in Datenbankabfragen verwendet. Daher ist das Verständnis der Divisionsoperation und ihrer Verwendung in OracleSQL eine der wesentlichen Fähigkeiten für Datenbankentwickler. In diesem Artikel werden die relevanten Kenntnisse über Divisionsoperationen in OracleSQL ausführlich erörtert und spezifische Codebeispiele als Referenz für die Leser bereitgestellt. 1. Divisionsoperation in OracleSQL

Der Modulo-Operator (%) in PHP wird verwendet, um den Rest der Division zweier Zahlen zu ermitteln. In diesem Artikel werden wir die Rolle und Verwendung des Modulo-Operators im Detail besprechen und spezifische Codebeispiele bereitstellen, um den Lesern ein besseres Verständnis zu erleichtern. 1. Die Rolle des Modulo-Operators Wenn wir in der Mathematik eine ganze Zahl durch eine andere ganze Zahl dividieren, erhalten wir einen Quotienten und einen Rest. Wenn wir beispielsweise 10 durch 3 dividieren, ist der Quotient 3 und der Rest ist 1. Um diesen Rest zu ermitteln, wird der Modulo-Operator verwendet. 2. Verwendung des Modulo-Operators In PHP verwenden Sie das %-Symbol, um den Modul darzustellen

Detaillierte Erläuterung der Funktion system() des Linux-Systems Der Systemaufruf ist ein sehr wichtiger Teil des Linux-Betriebssystems. Er bietet eine Möglichkeit, mit dem Systemkernel zu interagieren. Unter diesen ist die Funktion system() eine der am häufigsten verwendeten Systemaufruffunktionen. In diesem Artikel wird die Verwendung der Funktion system() ausführlich vorgestellt und entsprechende Codebeispiele bereitgestellt. Grundlegende Konzepte von Systemaufrufen Systemaufrufe sind eine Möglichkeit für Benutzerprogramme, mit dem Betriebssystemkernel zu interagieren. Benutzerprogramme fordern das Betriebssystem an, indem sie Systemaufruffunktionen aufrufen

JavaScript-Tutorial: So erhalten Sie HTTP-Statuscode. Es sind spezifische Codebeispiele erforderlich. Vorwort: Bei der Webentwicklung ist häufig die Dateninteraktion mit dem Server erforderlich. Bei der Kommunikation mit dem Server müssen wir häufig den zurückgegebenen HTTP-Statuscode abrufen, um festzustellen, ob der Vorgang erfolgreich ist, und die entsprechende Verarbeitung basierend auf verschiedenen Statuscodes durchführen. In diesem Artikel erfahren Sie, wie Sie mit JavaScript HTTP-Statuscodes abrufen und einige praktische Codebeispiele bereitstellen. Verwenden von XMLHttpRequest

Hallo zusammen, heute wollen wir über die Zero-Copy-Technologie von Linux sprechen. Wir werden den Systemaufruf sendfile als Einstiegspunkt verwenden, um die Grundprinzipien der Zero-Copy-Technologie eingehend zu untersuchen. Die Kernidee der Zero-Copy-Technologie besteht darin, das Kopieren von Daten zwischen Speichern zu minimieren und die Effizienz und Leistung der Datenübertragung durch Optimierung des Datenübertragungspfads zu verbessern. 1. Einführung in die Zero-Copy-Technologie Die Linux-Zero-Copy-Technologie ist eine Technologie zur Optimierung der Datenübertragung. Sie verbessert die Effizienz der Datenübertragung, indem sie die Anzahl der Datenkopien zwischen Kernelmodus und Benutzermodus reduziert. Während des Datenübertragungsprozesses ist es normalerweise erforderlich, die Daten vom Kernel-Puffer in den Anwendungspuffer und dann vom Anwendungspuffer in den Puffer des Netzwerkgeräts zu kopieren, bevor die Übertragung abgeschlossen werden kann. Vorteile der Zero-Copy-Technologie

Detaillierte Erläuterung des Linux-Befehls „curl“ Zusammenfassung: Curl ist ein leistungsstarkes Befehlszeilentool für die Datenkommunikation mit dem Server. In diesem Artikel wird die grundlegende Verwendung des Curl-Befehls vorgestellt und tatsächliche Codebeispiele bereitgestellt, um den Lesern zu helfen, den Befehl besser zu verstehen und anzuwenden. 1. Was ist Locken? Curl ist ein Befehlszeilentool zum Senden und Empfangen verschiedener Netzwerkanfragen. Es unterstützt mehrere Protokolle wie HTTP, FTP, TELNET usw. und bietet umfangreiche Funktionen wie Datei-Upload, Datei-Download, Datenübertragung und Proxy

Eine detaillierte Erklärung von Promise.resolve() erfordert spezifische Codebeispiele. Promise ist ein Mechanismus in JavaScript zur Verarbeitung asynchroner Vorgänge. In der tatsächlichen Entwicklung ist es häufig erforderlich, einige asynchrone Aufgaben zu verarbeiten, die nacheinander ausgeführt werden müssen, und die Methode Promise.resolve () wird verwendet, um ein erfülltes Promise-Objekt zurückzugeben. Promise.resolve() ist eine statische Methode der Promise-Klasse, die a akzeptiert
