javascript - Question sur la copie récursive du code objet
淡淡烟草味
淡淡烟草味 2017-05-19 10:25:31
0
2
486
// 使用递归来实现一个深度克隆,可以复制一个目标对象,返回一个完整拷贝
var deepClone = function fnDeepClone(obj){
    var result = typeof obj.splice === 'function'?[]:{},//如果这句注释掉,会抛出异常,这句发挥的是什么作用?
    key;
    if (obj && typeof obj === 'object'){//这句怎么理解?如果obj是对象,typeof obj一定是对象啊。
        for (key in obj ){
            if (obj[key] && typeof obj[key] === 'object'){
                result[key] = fnDeepClone(obj[key]);
            }else{
                result[key] = obj[key];//这句怎么理解?复制的不是值,而是键值对?
            } 
        }
        return result;
    }
    return obj;
}
var arr=[2,3,[6,7]];
var brr=deepClone(arr);
console.log(brr);
淡淡烟草味
淡淡烟草味

répondre à tous(2)
黄舟
  1. Déterminez si l'objet actuel est un objet ou un tableau. S'il s'agit d'un tableau, alors le résultat est également un tableau, sinon le résultat est un objet ordinaire

  2. .
  3. Votre compréhension est fausse, cette phrase signifie si obj existe et est un objet如果 obj 存在,并且是对象

  4. 如果不是引用类型(对象),则说明当前键的值是基础类型,则直接将对应新的 result 对应的 key 也设置为这个值就可以了

by the way. 因为深拷贝一个对象有可能会造成内存泄漏问题。因为 key 有可能引用一个类型,从而在内部引用自身造成内存泄漏,所以深拷贝在遇到引用类型的 key 时会仅仅把 heap 内存的地址进行复制。

而且题目中第一行通过判断 splice 来判断是数组还是对象是不严谨的,万一对象下有个叫 splice 的属性刚好是函数呢,Array.isArray 方法的支持度很好,可以换成这个。

ES6的话直接 Object.assign()

🎜🎜S'il ne s'agit pas d'un type référence (objet), cela signifie que la valeur de la clé actuelle est un type de base, alors définissez directement la clé correspondant au nouveau résultat à cette valeur🎜🎜 🎜d'ailleurs. Parce que la copie profonde d'un objet peut provoquer des fuites de mémoire. Étant donné que la clé peut faire référence à un type, se référençant ainsi en interne et provoquant une fuite de mémoire, la copie profonde ne copiera l'adresse de la mémoire tas que lorsqu'elle rencontrera une clé de type de référence. 🎜 🎜Et la première ligne de la question n'est pas rigoureuse pour juger s'il s'agit d'un tableau ou d'un objet en jugeant splice Et s'il y avait une propriété appelée splice sous l'objet qui se trouve être une fonction ? Le support de la méthode Array.isArray Très bien, vous pouvez la remplacer par celle-ci. 🎜 🎜Pour ES6, utilisez simplement Object.assign() 🎜
漂亮男人
  1. Déterminez si obj est un objet ou un tableau, car seuls les tableaux ont la méthode splice. Si obj.splice a une valeur de retour indiquant que obj est un tableau, alors le le résultat est également un tableau, sinon le résultat est un objet. obj.splice有返回值说明obj是数组,那么result也是数组,否则result就是对象。

  2. if(obj存在,并且obj是对象),因为null的typeof也是object,多一步判断可以去掉null。

  3. 如果是复制的值是一个private值,那么就直接赋值就可以,如果是对象,那么就像上一步一样递归的复制对象,直到复制的值是private

if (obj existe, et obj est un objet), parce que le typeof de null est également un objet, une étape supplémentaire de jugement peut supprimer null.


#🎜🎜#Si la valeur copiée est une valeur privée, alors attribuez-la simplement directement. S'il s'agit d'un objet, copiez l'objet de manière récursive comme à l'étape précédente jusqu'à ce que la valeur copiée soit atteinte. value est la valeur privée. #🎜🎜##🎜🎜# #🎜🎜# #🎜🎜# En parlant de copie superficielle et de copie profonde, je vous recommande sans vergogne de lire un article que j'ai écrit...#🎜🎜#/a/11...#🎜🎜#
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!