<!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>