js浅拷贝和深拷贝

浅拷贝是拷贝一层,深层次的对象级别的就拷贝引用;深拷贝是拷贝多层,每一级别的数据都会拷贝出来;

理解:浅拷贝的时候如果数据是基本数据类型,那么就如同直接赋值那种,会拷贝其本身;

如果除了基本数据类型之外还有一层对象,那么对于浅拷贝而言就只能拷贝其引用,对象的改变会反应到拷贝对象上;

但是深拷贝就会拷贝多层,即使是嵌套了对象,也会都拷贝出来。

即浅拷贝只拷贝第一层的数据,开辟新的内存空间,下面的层次还是共用内存空间;

而深拷贝每一层都是新的内存空间,独立起来的

浅拷贝的常用方法:

1.ES6的扩展运算符

let obj = {
name:“dilireba”
}
let newObj = {…obj}
obj.name = “liqin”
console.log(obj,newObj)
//{ name: ‘liqin’ } { name: ‘dilireba’ }

2.ES6中的Object.assign方法

复制代码
var obj1 = {
    a: "hello",
    b: {
        a: "hello",
        b: 21}
};
 
var cloneObj1= Object.assign({}, obj1);
cloneObj1.a = "changed"; 
cloneObj1.b.a = "changed";
console.log(obj1.a);  //hello
console.log(obj.b.a); // "changed"
复制代码

改变cloneObj1.a的时候,因为是浅拷贝在第一层,互不影响,所以obj1.a还是hello

改变cloneObj1.b.a的时候,是在第二层的,与obj1.b.a共用一个内存空间,所以obj1.b.a是新的数据changed

深拷贝常用方法:

1.转成 JSON 再转回来

JSON.parse(JSON.stringify(obj))

缺点:

抛弃对象的constructor。也就是深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object。

只有可以转成JSON格式的对象才可以这样用,像function没办法转成JSON,

如果你拷贝的对象中存在函数,函数会消失

var obj1 = { fun: function(){ console.log(123) } };
var obj2 = JSON.parse(JSON.stringify(obj1));
console.log(typeof obj1.fun);
// 'function'
console.log(typeof obj2.fun);
// 'undefined' <-- 没复制

2.递归拷贝

复制代码
function deepClone(initalObj, finalObj) {    
  var obj = finalObj || {};    
  for (var i in initalObj) {        
    var prop = initalObj[i];        // 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
    if(prop === obj) {            
      continue;
    }        
    if (typeof prop === 'object') {
      obj[i] = (prop.constructor === Array) ? [] : {};            
      arguments.callee(prop, obj[i]);
    } else {
      obj[i] = prop;
    }
  }    
  return obj;
}
var str = {};
var obj = { a: {a: "hello", b: 21} };
deepClone(obj, str);
console.log(str.a);
复制代码

 

posted on   sss大辉  阅读(190)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示