栈内存和堆内存
栈内存和堆内存
我们知道程序是需要加载到内存中来执行的,我们可以将内存划分为两个区域:栈内存和堆内存。
- 原始类型占据的空间是在栈内存中分配的;
- 对象类型占据的空间是在堆内存中分配的;
值类型和引用类型
- 原始类型的保存方式:在变量中保存的是值本身;所有原始类型也被称之为值类型;
- 对象类型的保存方式:在变量中保存的是对象的引用;所以对象类型也被称之为引用类型;
JS代码是单线程的,代码从上到下执行,栈内存是先入后出的,所以上面的代码在栈的底部;
基本数据类型直接在栈内存中分配内存,变量保存的是值本身;
引用数据类型在堆内存中分配内存,并生成16进制地址,栈中的变量保存的是16进制地址,即对象的引用地址;
赋值操作是在栈中完成的:
const nickName=name;
将栈内存中name的值赋值给nickName,即nickName="fsllala"
;
const info = obj;
将栈内存中obj的内存地址赋值给info,即info=0x100;
1 | const name = "fsllala"; |
变量的比较
基本数据类型比较的是值;引用数据类型比较的是地址;
1 | const a = 123; |
引用的赋值
info是个对象,在栈内存中保存的是一个指针,在堆内存中保存的是代码;
info.friend
又是一个对象,保存一个指针,在堆内存中开辟新的内存来保存info.friend
中的代码;所以info.friend
为一个指针,赋值给了friend;
1 | const info = { |
值传递和引用传递的区别
值传递
在栈内存中进行赋值,
const num = 100
基本数据类型,直接赋值;foo(num)
其实是foo(100)
;即a=100
;然后又a=200
1 | function foo(a) { |
引用传递
在栈内存中进行赋值,引用数据类型赋值的是指针,在堆内存中保存代码;
foo(obj)
其实是foo(指针)
,即a=指针
,紧接着,a={name:"why"}
,在堆内存中保存其代码,分配一个新的指针给a,即a=指针2
1 | function foo(a) { |
同上面相比,上面是新开辟了一个堆内存,这个是通过指针对堆地址的代码进行了修改;
1 | function foo(a) { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Forward の Blog!
评论