07-基本數據類型與引用數據類型

07-基本數據類型與引用數據類型

在JS中

  基本數據類型:Number    String    Boolean    Undefined    Null

  引用數據類型:Object

問題一

1     <script type="text/javascript">
2         var a = 1;
3         var b = a;
4         a++;
5         console.log("a = " + a);
6         console.log("b = " + b);
7     </script>

View Code

 

 

執行上面的代碼,我們可以發現a的值發生了改變(由原來的1變為2),但是b的值並沒有發生改變

 

問題二

 1     <script type="text/javascript">
 2         var a = 1;
 3         var b = a;
 4         a++;
 5         console.log("a = " + a);
 6         console.log("b = " + b);
 7 
 8         var obj = new Object();
 9         obj["name"] = "孫悟空";
10         var obj2 = obj;
11         obj["name"] = "唐僧";
12         console.log("obj.name = " + obj.name);
13         console.log("obj2.name = " + obj2.name);
14     </script>

View Code

 

 

執行這段 代碼,我們發現obj的name的值與obj2的1name的值都發生了相應的改變,都由「孫悟空」變成了「唐僧」

探討原因

那麼產生上面這兩個問題的原因是什麼呢?
之所以產生上面這兩種情況是因為在JS中基本數據類型和引用數據類型儲存方式不同,基本數據類型保存的是值,引用數據類型保存的是內存地址。

下面我用兩幅圖解釋一下產生這種狀況的原因:

 

 

 

 問題再探

我們再來看一個有趣的例子:

1         var obj = new Object();
2         var obj2 = new Object();
3         obj.name = "孫悟空";
4         obj2.name = "孫悟空";
5         console.log(obj);
6         console.log(obj2);

View Code

執行上面代碼,我們得到如下圖所示的結果,我們明顯能夠觀察到這兩個對象是相同的

 

但是當我們在這裡添加這樣一行代碼:

console.log(obj == obj2);

這句代碼執行結果如下圖所示,為False,此時我們就能看到有趣之處,明明我們第一次看到的打印出來的兩個對象是相同的,但是使用代碼判斷結果確實False。

 

 

下面我來解釋一下原因:

還是因為引用數據類型裏面保存的是內存地址,我們創建了兩個相同的對象,等於是開闢了兩塊內存,每一塊內存對應一個內存地址,我們執行obj == obj2的時候實際上是判斷內存這兩個內存的地址是否相同。

 總結

在JS中引用數據類型中保存的都是內存地址,基本數據類型中保存的是值