扫码关注公众号

前端JS之深拷贝和浅拷贝
10-18
312观看
01

实现浅拷贝的方法?

(1)for···in只循环第一层//只复制第一层的浅拷贝functionsimpleCopy(obj1){varobj2=Array.isArray(obj1)?[]:{};for(letiinobj1){obj2[i]=obj1[i];}returnobj2;}varobj1={a:1,b:2,c:{d:3}}varobj2=simpleCopy(obj1);obj2.a=3;obj2.c.d=4;alert(obj1.a);//1alert(obj2.a);//3alert(obj1.c.d);//4alert(obj2.c.d);//4(2)Object.assign方法varobj={a:1,b:2}varobj1=Object.assign(obj);obj1.a=3;console.log(obj.a)//3(3)直接用=赋值leta=[0,1,2,3,4],b=a;console.log(a===b);a[0]=1;console.log(a,b);

来自:JavaScript语言-语法相关-操作符相关
02

实现深拷贝的方法?

(1)采用递归去拷贝所有层级属性(2)通过JSON对象来实现深拷贝(3)通过jQuery的extend方法实现深拷贝(4)lodash函数库实现深拷贝(5)Reflect法(6)手动实现深拷贝(7)如果对象的value是基本类型的话,也可以用Object.assign来实现深拷贝,但是要把它赋值给一个空对象(8)用slice实现对数组的深拷贝(9)用concat实现对数组的深拷贝(10)直接使用varnewObj=Object.create(oldObj),可以达到深拷贝的效果。(11)使用扩展运算符实现深拷贝

来自:JavaScript语言-语法相关-操作符相关
03

说一下深浅拷贝基础(数据类型)。

【解析】1.基础数据类型(值传递)//基本数据类型的拷贝(复制copy)深拷贝和浅拷贝//前提:需要理解值传递地址传递基本数据类型值传递numberstringbooleannullundefinedSysmbolbigInt//Numbera=1.1;b=a;b=2;console.log(a,b)//Stringa='hello';b=a;b=3;console.log(a,b)//Booleana=false;b=a;b='sss';console.log(a,b)//Undefineda=undefined;b=a;b=false;console.log(a,b)//Nulla=null;b=a;b=undefined;console.log(a,b)2.复杂数据类型(地址传递)//复杂数据类型(object)的拷贝地址传递注意常用的复杂数据类型包括:{}、[]、function(){}、Date、RegExp、null(这个比较特殊)等//1、我们依然用一的简单赋值(=)来进行一遍操作(赋值)//经过实践我们会发现://1、当类型为{}、[]的时候,改变b的值,a也会跟着一起变化。//2、当类型为Date、function、RegExp的时候,a保持不变。//总结://我们发现{}或者[]时,简单的赋值操作并不能实现它们的拷贝,只是改了b的指向,使a和b都指向同一个引用,随意改变一个,都会影响另外一个的值。{}a={name:'abc'};b=a;b.name='sss';console.log(a,b)//[]a=['a','b','c'];b=a;b[1]='d';console.log(a,b)//functiona=function(){alert('aaa');};b=a;b=function(){alert('bbb');};console.log(a.toString(),b.toString())//Datea=newDate('2018-10-1100:00:00');b=a;b=newDate('1970-01-0100:00:00');console.log(a,b)//RegExpa=newRegExp('abc');b=a;b=newRegExp('aaa');console.log(a,b)

来自:JavaScript语言-语法相关-操作符相关
04

深拷贝与浅拷贝的区别。

【解析】数据分为基本数据类型和引用数据类型。基本数据类型:数据直接存储在栈中;引用数据类型:存储在栈中的是对象的引用地址,真实的对象数据存放在堆内存中。浅拷贝:对于基本数据类型:直接复制数据值;对于引用数据类型:只是复制了对象的引用地址,新旧对象指向同一个内存地址,修改其中一个对象的值,另一个对象的值也随之改变。深拷贝:对于基本数据类型:直接复制数据值;对于引用数据类型:开辟新的内存空间,在新的内存空间里复制一个一模一样的对象,新老对象不共享内存,修改其中一个对象的值,不会影响另一个对象。深拷贝相比于浅拷贝速度较慢并且花销较大。

来自:常见分析算法-分类
课程
专栏
web前端:常用的js语法(一)
常用的js语法
知乎
语法
web前端:常用的js语法(二)
map方法等
知乎
语法
【校招VIP】JS的基本语法
continue是跳出本次循环,继续执行下一次循环
csdn
JS
语法
js语言和框架-JavaScript语言-语法相关-操作符相关
3专栏
1课程
4 试题