博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从最最最底层出发的深浅拷贝
阅读量:7187 次
发布时间:2019-06-29

本文共 895 字,大约阅读时间需要 2 分钟。

每每面试都会遇见的这个问题吧?

但是每次像是说对了,但是好像又差点什么。

我叫秀儿,请跟我来。just do it

(来啦,老弟~)

出发点为js的数据类型

字符串、数字、布尔、数组、对象、Null、Undefined(这俩我们先不研究)

先按难度分一下:

-》简单数据类型

String(其实它也不简单) Number Boolean

-》复杂数据类型

Array Object

再按照操作变量时该类型的操作对象分一下:有图

顾名思义:

值类型就是当“=”赋值操作时,操作的是值

引用类型就是当“=”赋值操作时,操作的是引用

引入堆栈的概念:

js中的变量是怎么存储的呢?

1.每次存储,都会去内存中申请一块存储单元(不连续性)

2.遇见简单类型变量,直接以栈的模式存储

3.遇见复杂类型变量,值以堆的模式存储,记录它的存储单元地址例如:0x01,然后将0x01以栈的模式存储

001开始画图,我们把他们抽象为椭圆和矩形

002存储简单类型:

(注:存储按照栈的模式,遵从压栈弹栈顺序。每次“=”赋值操作,都会把栈里的存储内容copy一份,然后存入栈里)

003存储复杂类型:

(注:存储按照堆的模式,遵从先进先出队列顺序。每次“=”赋值操作,都会把栈里的存储的地址copy一份,然后存入栈里,不操作堆内存,所以堆里的内容不发生变化,栈里的地址是相同的,指向一块存储空间----这就是浅拷贝)

那么如何实现深拷贝呢?

-》原理其实就是把堆内存中的content复制一份,重新生成个地址,把这个新地址在栈里存一份

1.循环复制。 

遍历到这个对象的所有属性,包括属性的属性,直到复制到简单类型变量,才算结束

2.Object.assign

 mdn说的很清楚了,这个很常用

3.序列化反序列化

function deepClone(obj){    return JSON.parse(JSON.stringify(obj))}复制代码

那就到这里吧,希望大家新的一年财源广进,名利双收!!

转载于:https://juejin.im/post/5c2c91c7e51d4570c053f161

你可能感兴趣的文章
MySQL高级 之 order by、group by 优化
查看>>
POJ3320:Jessica's Reading Problem(尺取法)
查看>>
Mysql学习——安装登录
查看>>
React-nwb的使用
查看>>
【人生思考】2015读书清单
查看>>
Vim的多窗口模式管理
查看>>
Android:EditText 设置弹出数字输入法键盘
查看>>
[Windows]Visual Studio Code个人配置
查看>>
防错笔记
查看>>
bzoj3232圈地游戏——0/1分数规划+差分建模+判环
查看>>
计算程序运行时间
查看>>
js 和后台交互
查看>>
Solr5.5高级应用(基于tomcat9)
查看>>
Linux企业运维人员最常用150个命令汇总
查看>>
使用js过滤字符串前后的空格
查看>>
22 October in 614
查看>>
Linux命令的那些事(一)
查看>>
Struts、Ajax、Restful、Web Service 狂想曲框架实现篇(三)
查看>>
PHP 过滤 及 字符转换 函数
查看>>
利用SOLR搭建企业搜索平台 之——solr的查询语法
查看>>