手写一张图,配合图文讲解看的一目了然,写的有点丑,看懂内容就行

1.我们需要了解js的内存分为栈内存和堆内存,栈内存中存放的是简单数据类型,还有堆内存中复杂数据类型的引用地址,堆内存中存放的就是复杂数据类型就是我们常说的object;

2.我们声明了五个简单数据类型,a=Number,b=String,c=Boolean,d=Undefined,e=Null,可以看到都是直接以键值对的形式储存在栈内存中了,这里漏掉了一点,简单提醒一下,简单数据类型的赋值不存在浅拷贝

3.我们声明了一个对象f = {g:2,h:‘张三’},接着把把f赋值给了新变量i,看图,底层做了两个操作,第一步在栈内存中声明了两个引用地址,i和f,我们可以看到,i和f指向的引用地址是同一个obj,这个就是典型的浅拷贝,这个也是为什么我们会发现,改变i或者f中的任意一个属相,两个对象里面的值都发生了变化,其实底层指向的是同一个obj

4.先科普一下深浅拷贝,浅拷贝就是吧对象f赋值给对象i,改变i或者f中的任何属相都会相互影响,两者同时发生变化,深拷贝就是吧对象f赋值给对象i,改变i或者f中的任何属不会相互影响,只是改变的对象属性发生变化

5.说完了浅拷贝,在接着往下看,我么通过一个深拷贝方法,

let j = JSON.parse(JSON.stringify(f)),吧f赋值给了j,再看看底层做了什么,底层先在栈内存中存放了一个新的引用地址,然后再堆内存中开辟了一个新的空间,吧f的值复制了一份,拿来存放另一个obj中,这里就是实现了一个深拷贝,j的引用地址直接指向了新的obj,这个时候深拷贝完成,所以改变j和f里面的任何属相改变会互补影响,看图就很明白了

js 对象存mysql js对象存储的原理_javascript


看到这里相信即使你是新手,也理解了堆和栈,以及深浅拷贝的原理了吧