<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>堆和栈</title>
</head>
<body>
<script>
// 栈内存
// a:'fwfwfw'
// b:123
// c:00 栈内存由下至上查找
var a = 'fwfwfw'
// 开辟1单元a 存储 'fwfwwfw'
var b = 123
// 开辟2单元b 存储 123
a = b;
// 开辟3单元a 存储 123
b = 43
// 开辟4单元b 存储 43
var c = a
// 开辟5单元c 存储 123
var c;
// 开辟6单元c 存储 123
var d;
// 开辟7单元d 存储 |从下至上找单元d未找到,变量已声明,开辟7单元d空间, 未存储数据:undefined
var d = 1232;
// 开辟8单元d 存储 1232 |8单元d内的 1232 并不会消失
var d;
// 开辟9单元d 存储 1232 |从下至上找到最近单元d,在8单元找到数据 空间内存储1232 找到并进行clone存储在9单元d;
var o = d;
// 开辟10单元o 存储 1232 |从下至上未找到单元o,开辟10单元o,找到单元d内空间数据1232 clone到10单元o空间内存储1232,
d = '666';
// 开辟11单元d 存储 '666'
var o;
// 开辟12单元o 存储 '1232' |从下至上找到10单元o,clone数据1232到12单元o
console.log(a, b, c, d, o) //a从下至上找最近的
// 取值会从下至上找栈内存中最近的一个存储单元 遇到同名时会拿取同名单元的存储数据;
// 栈内存存储原始数据,原始数据一旦创建,不可删除,永久存储,只会开辟新单元空间存放数据;
// 内部的原始数据删除之后可以找回;
// 堆内存
var arr = [1, 2]
// 开辟新1单元arr 堆内存 存放1,2 在栈内存中开辟13单元arr 存储 1单元堆内存指向
var arr2 = arr;
// 未开辟新单元 堆内存 在栈内存中开辟14单元arr2 存储 1单元堆内存指向
arr = [3]
// 开辟新2单元arr 堆内存 存放3 在栈内存中开辟15单元arr 存储 2单元堆内存指向
var arr;
// 未开辟新单元 堆内存 在栈内存中开辟16单元arr 存储 2单元堆内存指向
arr2 = arr;
// 未开辟新单元 堆内存 在栈内存中开辟17单元arr2 存储 2单元堆内存指向
arr[1] = 'nihao'
// 未开辟新单元 堆内存 在栈内存中开辟18单元arr 存储 2单元堆内存指向 |从下至上找到堆内存2单元arr更改数据为 [3,'nihao']
console.log(arr, arr2)
// 堆内存 用来存储引用类型数据 引用数据的指针路径存在栈内存
// 修改引用数据类型时,会通过栈内存的存储路径找到堆内存中的数据进行修改,栈内存中的存储指针路径并不会修该,所以在更改引用数据类型时,其他栈内存有引用的也会更改;
// !栈内存会不断叠加,原始数据不能删除 ,容易造成栈内存溢出;
</script>
</body>
</html>