


Explication détaillée des copies profondes et superficielles des tableaux et objets js
Cet article présente principalement la copie profonde et superficielle des tableaux et des objets en js. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer. J'espère que Meng pourra vous aider.
Prémisse : La différence entre les types de données primitifs et les types d'objets lors de l'attribution de valeurs.
Les types de données JavaScript sont divisés en types de données primitifs et types d'objets. Les deux sont stockés de différentes manières en mémoire, ce qui entraîne des différences dans leur affectation. Prenons respectivement une châtaigne
var x = 1; var y = x; //y获得了和x同样的值 y = 2; console.log(x); // 1 var m = [1,2]; //m存放的是指向[1,2]这个数组对象的引用地址 var n = m; //n也获得 [1,2]数组对象的引用地址 n[0] = 3; console.log(m); //[3,2]
Cela peut être vu sur la châtaigne ci-dessus : lorsque le type de données d'origine est attribué, la valeur réelle des données est donnée après l'affectation. , les deux sont juste Les valeurs sont exactement les mêmes et ne s'affecteront pas ; le type d'objet donne l'adresse de référence des données d'origine, donc les anciennes et les nouvelles données s'affecteront, car ce sont essentiellement les mêmes données. objet, comme le tableau dans Shangli
Qu'est-ce qu'une copie superficielle ?
Comme son nom l'indique, la copie superficielle est une méthode de copie superficielle ; lorsque la valeur de l'attribut est un type d'objet, seule la référence aux données de l'objet est copiée, ce qui donne l'ancien et le nouveau. les données ne sont pas complètement séparées et elles interagiront également les unes avec les autres. Prenons un autre exemple...
//测试数据 var array1 = ['a',1,true,{name:'lei',age:18}]; //concat() slice() 实现浅拷贝 var array2 = array1.concat() //修改拷贝后的数据 array2[0] = 'b'; //array1[0]是原始数据类型 所以是直接赋值的 array2[3].name = 'zhang'; //array1[3]是对象数据类型 所以拷贝的是对象的引用,其实还是和原数组使用同一对象 console.log(array1); // ['a',1,true,{name:'zhang',age:18}]
Dans le châtaignier, array2 est une copie superficielle de array1. Les éléments du tableau sont de types de données primitifs et n'affecteront pas. les uns les autres (array1[ 0]), mais array1[3] est un type d'objet et s'affectera toujours.
Comment implémenter une copie superficielle
Array.concat() ou array.slice() dans Shangli est une manière spéciale d'implémenter une copie superficielle d'un tableau.
Comment le mettre en œuvre soi-même ? Ne suffirait-il pas de parcourir chaque attribut de l'objet/tableau puis de l'attribuer à un nouvel objet ? Comme suit, implémentez
//实现浅拷贝 function shallowCopy( target ){ if(typeof target !== 'object') return ; //判断目标类型,来创建返回值 var newObj = target instanceof Array ? [] : {}; for(var item in target){ //只复制元素自身的属性,不复制原型链上的 if(target.hasOwnProperty(item)){ newObj[item] = target[item] } } return newObj }</strong> //测试 var test = [1,'a',{name:'lei',age:18}]; var copy = shallowCopy(test); console.log(copy[2].name); //lei copy[2].name = 'zhang'; console.log(test[2].name); //zhang 原数据也被修改
copie profonde et sa mise en œuvre
On peut essentiellement comprendre à partir de l'explication de la copie superficielle que la copie profonde est une copie « complète » après la copie, les anciennes et les nouvelles données sont complètement. séparés et ne partagent plus les valeurs d'attribut du type d'objet et ne s'affecteront pas.
Méthode d'implémentation :
Méthode délicate JSON.parse(JSON.stringify(Obj))
var test = [1,'a',{name:'lei',age:18}]; var copy1 = JSON.parse(JSON.stringify(test)); //特殊方式 console.log(copy1); copy1[2].name = 'zhang' console.log(test); //[1,'a',{name:'lei',age:18}] 未受到影响
Remarque : Cette méthode ne peut pas copier en profondeur les objets dont les valeurs d'attribut sont des fonctions. Vous pouvez l'essayer vous-même
2 Implémenter la copie profonde
Nous avons déjà implémenté la copie superficielle. Pensez-y. Lors de l'attribution de valeurs aux attributs de type d'objet, le résultat est une séparation incomplète. Par conséquent, nous devons modifier la façon de copier les valeurs d'attribut de type d'objet et appeler à nouveau une copie approfondie. comme suit :
//实现深拷贝 function deepCopy( target ){ if(typeof target !== 'object') return ; //判断目标类型,来创建返回值 var newObj = target instanceof Array ? [] : {}; for(var item in target){ //只复制元素自身的属性,不复制原型链上的 if(target.hasOwnProperty(item)){ newObj[item] = <strong>typeof target[item] == 'object' ? deepCopy(target[item]) : target[item] //判断属性值类型 </strong> } } return newObj } //测试 var test = [1,'a',{name:'lei',age:18}]; var copy2 = deepCopy(test); copy2[2].name = 'zhang' console.log(test); ////[1,'a',{name:'lei',age:18}] 未受到影响
Résumé
Assurez-vous de comprendre la cause de la copie superficielle : lors de la copie d'un objet tapez les données, l'adresse de référence est copiée, en utilisant C'est toujours le même objet de données ; donc la façon d'implémenter la copie complète est de copier en profondeur de manière récursive la valeur de l'attribut du type d'objet pour éviter l'affectation directe.
Recommandations associées :
Analyse des exemples de copie superficielle et de copie profonde $.extend de JQuery
Que sont la copie profonde et la copie superficielle js Et sa méthode de mise en œuvre
Réaliser une copie profonde et une copie superficielle dans jquery
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le système d'exploitation Windows est l'un des systèmes d'exploitation les plus populaires au monde et sa nouvelle version Win11 a beaucoup attiré l'attention. Dans le système Win11, l'obtention des droits d'administrateur est une opération importante. Les droits d'administrateur permettent aux utilisateurs d'effectuer davantage d'opérations et de paramètres sur le système. Cet article présentera en détail comment obtenir les autorisations d'administrateur dans le système Win11 et comment gérer efficacement les autorisations. Dans le système Win11, les droits d'administrateur sont divisés en deux types : administrateur local et administrateur de domaine. Un administrateur local dispose de tous les droits d'administration sur l'ordinateur local

Explication détaillée de l'opération de division dans OracleSQL Dans OracleSQL, l'opération de division est une opération mathématique courante et importante, utilisée pour calculer le résultat de la division de deux nombres. La division est souvent utilisée dans les requêtes de bases de données. Comprendre le fonctionnement de la division et son utilisation dans OracleSQL est donc l'une des compétences essentielles des développeurs de bases de données. Cet article discutera en détail des connaissances pertinentes sur les opérations de division dans OracleSQL et fournira des exemples de code spécifiques pour référence aux lecteurs. 1. Opération de division dans OracleSQL

L'opérateur modulo (%) en PHP est utilisé pour obtenir le reste de la division de deux nombres. Dans cet article, nous discuterons en détail du rôle et de l'utilisation de l'opérateur modulo et fournirons des exemples de code spécifiques pour aider les lecteurs à mieux comprendre. 1. Le rôle de l'opérateur modulo En mathématiques, lorsqu'on divise un entier par un autre entier, on obtient un quotient et un reste. Par exemple, lorsque l’on divise 10 par 3, le quotient est 3 et le reste est 1. L'opérateur modulo est utilisé pour obtenir ce reste. 2. Utilisation de l'opérateur modulo En PHP, utilisez le symbole % pour représenter le module

Explication détaillée de la fonction d'appel système Linux system() L'appel système est une partie très importante du système d'exploitation Linux. Il fournit un moyen d'interagir avec le noyau système. Parmi elles, la fonction system() est l’une des fonctions d’appel système couramment utilisées. Cet article présentera en détail l’utilisation de la fonction system() et fournira des exemples de code correspondants. Concepts de base des appels système Les appels système sont un moyen permettant aux programmes utilisateur d'interagir avec le noyau du système d'exploitation. Les programmes utilisateur demandent au système d'exploitation en appelant des fonctions d'appel système

Tutoriel JavaScript : Comment obtenir le code d'état HTTP, des exemples de code spécifiques sont requis Préface : Dans le développement Web, l'interaction des données avec le serveur est souvent impliquée. Lors de la communication avec le serveur, nous devons souvent obtenir le code d'état HTTP renvoyé pour déterminer si l'opération a réussi et effectuer le traitement correspondant en fonction de différents codes d'état. Cet article vous apprendra comment utiliser JavaScript pour obtenir des codes d'état HTTP et fournira quelques exemples de codes pratiques. Utilisation de XMLHttpRequest

Explication détaillée de la commande curl de Linux Résumé : curl est un puissant outil de ligne de commande utilisé pour la communication de données avec le serveur. Cet article présentera l'utilisation de base de la commande curl et fournira des exemples de code réels pour aider les lecteurs à mieux comprendre et appliquer la commande. 1. Qu’est-ce que la boucle ? curl est un outil de ligne de commande utilisé pour envoyer et recevoir diverses requêtes réseau. Il prend en charge plusieurs protocoles, tels que HTTP, FTP, TELNET, etc., et fournit des fonctions riches, telles que le téléchargement de fichiers, le téléchargement de fichiers, la transmission de données, le proxy.

Bonjour à tous, parlons aujourd'hui de la technologie Linux zéro copie. Nous utiliserons l'appel système sendfile comme point d'entrée pour explorer en profondeur les principes de base de la technologie zéro copie. L'idée principale de la technologie zéro copie est de minimiser la copie des données entre les mémoires et d'améliorer l'efficacité et les performances de la transmission des données en optimisant le chemin de transmission des données. 1. Introduction à la technologie zéro copie La technologie Linux zéro copie est une technologie utilisée pour optimiser la transmission de données. Elle améliore l'efficacité de la transmission de données en réduisant le nombre de copies de données entre le mode noyau et le mode utilisateur. Pendant le processus de transmission de données, il est généralement nécessaire de copier les données du tampon du noyau vers le tampon d'application, puis du tampon d'application vers le tampon du périphérique réseau avant que la transmission puisse être terminée. Avantages de la technologie zéro copie

En tant que langage de programmation largement utilisé dans le domaine du développement de logiciels, le langage C est le premier choix de nombreux programmeurs débutants. L'apprentissage du langage C peut non seulement nous aider à acquérir des connaissances de base en programmation, mais également à améliorer nos capacités de résolution de problèmes et de réflexion. Cet article présentera en détail une feuille de route d'apprentissage du langage C pour aider les débutants à mieux planifier leur processus d'apprentissage. 1. Apprendre la grammaire de base Avant de commencer à apprendre le langage C, nous devons d'abord comprendre les règles de grammaire de base du langage C. Cela inclut les variables et les types de données, les opérateurs, les instructions de contrôle (telles que les instructions if,
