每每面试都会遇见的这个问题吧?
但是每次像是说对了,但是好像又差点什么。
我叫秀儿,请跟我来。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))}复制代码
那就到这里吧,希望大家新的一年财源广进,名利双收!!