<script>
// js数据类型共有七种 分为两大类
// 1.简单数据类型(值类型): 栈中存储数据 赋值拷贝的是数据 修改拷贝后的数据对原数据没有影响
//
// 2.复杂数据类型(引用类型): 栈中存储地址 堆中存储数据 赋值拷贝地址 修改拷贝后的数据对原数据有影响
// 刷卡
let num1 = 10
let num2 = num1
num2 = 100
console.log(num1, num2) // 10 100
let obj1 = { name: '张三', age: 30 }
let obj2 = obj1
obj2.age = 33
console.log(obj1, obj2) // 均为 { name: '张三',age: 33}
// let 只能在栈中开辟空间
// let num1 = 10,
// 栈(钱包) 空间小 但是运行快 堆(银行) 空间大 但是运行较慢
// 等号都是从右往左解析 但是仅仅是等号
// 这里let是优先执行 因此 他会先走 let num1 然后再走num1 = 10
// 这里变量 num1 只能在栈中开空间 num2 同理
// 值类型的 拷贝的是数据 修改拷贝后的数据对原数据没有影响
// let obj1 在栈中开空间 一般说复杂数据类型在堆里面开空间 但是是否在里面开空间
// 取决于 []中括号 和 {}花括号 来决定 他不是let 来决定的
// 左边let obj1在栈中开完空间后 然后就会解析右边的 这里由于是花括号 编译器就在堆里面开辟空间了
// 变量名字是指栈里面的名字 堆里面先说存储 在堆开辟的大空间里面 又有小房间 来装 name 和 age
// 数据比较多 栈放不下 因此会存放在堆里面 完成存储后 为了证明这是你的账户以及财产
// 他会给你一张银行卡 也就是一个 二进制的堆地址 然后等号会赋值把 这个地址给放在栈的 obj1的空间里
// 同理obj2 也是在栈中开空间 拷贝直接把地址拷给过去 因此两个的地址一样 相当于 同一个账户的主卡和副卡
// 那么当我们需要引用里面的数据只需要刷卡就可以了
// 这就是为什么引用类型无法直接使用 要么使用点语法 要么使用中括号语法[]
// 因此此时的两张银行卡指向的是同一个账户 另外一个人花钱用银行卡的话 本质是通过这个地址来刷这个卡
//
// let age = obj1.age 这个时候拷贝的是数据 此时 age把33 取出来了
// 此时修改age的值 obj1的不会改变 age = 35
// console.log(age,obj1.age) // 35 / 33
// let s = document.querySelector('#second') // dom对象 : 拷贝地址
// s.innerHTML-- // 页面会变化 拷贝地址
// let s = document.querySelector('#second').innerText // 拷贝的是对象里面的字符串 拷贝数据
// s-- // 页面不会变 你只是把 s 变了 obj没有变
// // 数据s变而来 但是页面的原值不能显示出来 需要重新赋值回去
// document.querySelector('#second').innerText = s
</script>