1 .首先要知道的知识点:
)1) 5种js基本数据类型:编号、字符串、空、未定义、布尔。
name和value都存在于堆栈内存中。 例如,var a=1;
当var b=a时,被复制的是a的值,不受a的值变化的影响。
)2)引用数据类型:函数、数组、对象、日期等
name存储在堆栈中,value存储在堆内存中
当var b=a时,b值指示与a值相同的地址,并且受a值变化的影响。
2 .写拷贝是指在b=a的情况下,a的值发生变化,b的值也发生变化;
深拷贝在b=a时,a的值变化,b的值不变化。
3 .写拷贝的实现方法:
functionshadowcopy(target,source ) for ) varkeyinsource ) if ) source.hasownproperty (key ) target (key ) source ) hasource }var obj1={}var obj2={a:1,b : { c :3 } } obj1=shadow copy (obj 1,obj2) obj1. b.c=0console.log } obj
4 .深度复制的实现方法
(1)递归赋值:
functiondeepcopy(target,source ) target=array.isarray ) source? []3360{}for(varkinsource ) if (type of source ) k )==='object ' ) { target [ k ]=deepcopy ] target,source [ k ]
(2) JSON.parse (JSON.stringify (obj ) )
JSON.stringify () :将js对象转换为字符串;
Jon.parse(3360将字符串转换为js对象。
示例:
var obj1={}var obj2={a:1,b : { c :3 } } obj1=JSON.parse (JSON.stringify (obj2) )缺点: JSON.parse
5.object.assign(target,source ) : object的本机属性,
如果目标对象的属性具有相同的键,则源对象的属性将复盖该属性。 后面源对象的属性将被复盖,就像前面源对象的属性一样。
Object.assign ()第1级属性是深拷贝,其他属性是轻拷贝。
以下是示例。
var obj1={ a :2 } var obj2={ a :1,b : { c :3 } } obj1=object.asign (obj 1,obj2) obj1.b.c=0; //c属于二次属性console.log(obj1,obj2)
注意:如果只有一个参数,则Object.assign直接返回该参数。 如果参数不是对象,则将其转换为对象,然后返回。
Object.assign ()其中,undefined和null不能转换为对象
typeofobject.assign(2)//“number”console.log (object.assign ) )//错误报告