javascript變量在內(nèi)存中原來(lái)是這樣的!

極客小俊
你不用拼過(guò)聰明人,你只需要拼過(guò)那些懶人 你就一定會(huì)超越大部分人!

標(biāo)量類(lèi)型的值 一般存儲(chǔ)在棧區(qū)中!
標(biāo)量指: 整型、浮點(diǎn)、字符串、布爾值、等..
對(duì)象類(lèi)型分為: 對(duì)象引用 和 對(duì)象體!
對(duì)象引用存儲(chǔ)在棧區(qū)中 、對(duì)象體存儲(chǔ)在堆區(qū)中、
1. 內(nèi)存空間基本數(shù)據(jù)存儲(chǔ)分析圖1

注意: 一旦new一個(gè)對(duì)象,就必然會(huì)在內(nèi)存中生成新的的區(qū)域來(lái)存儲(chǔ)對(duì)象數(shù)據(jù)、
而且最重要的就是這個(gè)時(shí)候在內(nèi)存中對(duì)象的地址是不一樣的 , 因?yàn)?new 會(huì)生成一個(gè)新的地址在棧區(qū)中
2.對(duì)象引用類(lèi)型地址傳遞分析圖2
代碼案例1:
?var json={
? ? ?"username":"張三",
? ? ?"age":22,
? ? ?"fn1":function(){
? ? ? ? ?console.log('我的名字叫'+this.username);
? ? ?}
?}
?
?//通過(guò)對(duì)象引用修改屬性值1
?/*function fn2(obj){
? ? ? obj.username="李四";
?}
?fn2(json);*/
?
?//通過(guò)對(duì)象引用修改屬性值2
?var a=json;
?a.username='李四';
?
?console.log(json.username);
分析圖如下

3.對(duì)象引用類(lèi)型地址傳遞分析圖3
代碼案例2:
?function Person(name,age,salary) {
? ? ?this.name=name;
? ? ?this.age=age;
? ? ?this.salary=salary;
?}
?
?function fn1(obj) {
? ? ?obj.name='王武';
? ? ?obj=new Person('李四',24,8000);
? ? ?console.log(obj.name);
?}
?
?var obj=new Person('張三',33,6000);
?
?console.log(obj.name); //結(jié)果: 張三
?
?fn1(obj); ? ?//結(jié)果 李四
?
?console.log(obj.name); ?// 王武
分析圖如下

對(duì)象引用 圖分析小結(jié):
在js中, 普通變量值作為函數(shù)的參數(shù)就是 值傳遞
在js中, 對(duì)象引用類(lèi)型的變量作為函數(shù)的參數(shù) 就是 址傳遞!
所以 注意一下 這里的值傳遞 與 址傳遞
一旦new一個(gè)對(duì)象 就一定會(huì)在堆區(qū)中創(chuàng)建一個(gè)空間,并賦予一個(gè)新地址 上面已經(jīng)說(shuō)過(guò)了!
4.對(duì)象數(shù)據(jù)的比較
在js中、基本數(shù)據(jù)類(lèi)型數(shù)據(jù)的比較 是值的比較 值相同就可以了、
對(duì)象類(lèi)型的比較 要滿足兩個(gè)要求、 第一是值要相同、第二引用地址也要相同才行
案例代碼:
?//--案例1
?var a=[1,2,3];
?var b=[1,2,3];
?
?console.log(a==b); ?//結(jié)果為false ?雖然值一樣,但地址是不同的!
?
?
?var a=[1,2,3];
?var b=a;
?console.log(a==b); ?//結(jié)果為true ?因?yàn)閎指向了a這個(gè)地址,并且值也能夠得到!
?
?
原理圖 如下:

大家的支持就是我堅(jiān)持下去的動(dòng)力!
