推广 热搜: 百度  搜索引擎  可以  企业  使用  选择  上海  page  技术  货运 

js深拷贝和先拷贝的实现方法:

   日期:2024-12-26     作者:bv5v5    caijiyuan  
核心提示:数据分为基本数据类型(string,number,boolean,null,undefined,symbol)和引用数据类型(object类型,有࿱

数据分为基本数据类型(string,number,boolean,null,undefined,symbol)和引用数据类型(object类型,有:object,array,data,regexp,function)

1.基本数据类型:直接存储在(stack的数据

2.引用数据类型:存储在该对象在栈中引用,真实的数据存放在内存里

具体呢?引用数据类型在栈中存储的是指针,然后让指针指向堆中该实体的地址。从而获取我们的实际的数据

浅拷贝只复制指向对象的指针,而不复制对象的本身,新旧对象还是共享同一块内存。

深拷贝会另外的创建一个一摸一样的对象,新对象和旧对象不共享内存,修改新对象不会改到源对象

浅拷贝就是只赋值数据(对象)本身,而不复制其内容(引用数据的内容,最终两个数组中指向同一套数据。

深拷贝则是既赋值本身也赋值内容

js中对于引用类型的数据,默认都是浅拷贝

object.assign我们经常会用到合并对象,当然利用object.assign性质我们也可以实现对象的拷贝

var obj1 = {a: 1, b: 2}

var obj2 = Object.assign({}, obj1)

obj2.a = 4

console.log(obj1, obj2)

 注意的是Object.assign第一个参数必须是个空对象

var obj1 = { a:1 , b:2 }

var obj2 = { ...obj1 }

obj2.a = 4;

js深拷贝和先拷贝的实现方法:

console.log(obj1,obj2)

 但这两种拷贝有一个问题就是只能赋值一层,假设我们有如下数据结构

var obj1 = [{
name: '臧三',
childs: ['小明', '小芳']
}]

var obj2 = [...obj1]

obj2[0].childs = []

console.log(obj1, obj2)

obj1,obj2 的结果均变了,这并不是我们想要的结果,所以我们要用到深拷贝。

//通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone(obj) {
  var _obj = JSON.stringify(obj),
    objClone = JSON.parse(_obj);
  return objClone;
}

//第一个参数不传(false是不能够显示的写出来的)默认为false,是浅拷贝。传true为深拷贝。
$.extend(true,object1, object2)

//newObject 即为深拷贝出来的对象
var newObject = $.extend(true , {} , object);

注意
这种简单粗暴的方法有其局限性,当值为undefined、function、symbol 会在转换过程中被忽略

利用数组的 slice 方法或者 concat 方法

 var arr1 = ["aaa","bbb","ccc"];
var arr2 = arr1.slice(0);
arr2[0] = "ddd";

 var arr1 = ["aaa","bbb","ccc"];
var arr2 = arr1.concat();
arr2[0] = "ddd";

本文地址:http://ww.kub2b.com/tnews/1759.html     企库往 http://ww.kub2b.com/ ,  查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。

 
 
更多>同类生活信息

文章列表
相关文章
最新动态
推荐图文
生活信息
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号