## 大連科技
自己整理的,不一定正確,思路也比較亂!歡迎指正!
先講清楚幾個概念!
變量:變量是一個名字。它綁定了一塊內(nèi)存(堆內(nèi)存)!
變量值:存儲在變量那塊內(nèi)存中的數(shù)據(jù)!數(shù)據(jù)基本可以分為兩種,基本數(shù)據(jù)類型和引用數(shù)據(jù)類型。(函數(shù)也相當(dāng)于一組變量和變量值(鍵值對),函數(shù)名就是一個變量。而變量值是那個函數(shù)的地址引用)
對象:不能被變量直接綁定,而是要通過引用來間接綁定的數(shù)據(jù)就是對象(函數(shù)也是對象,"萬物皆對象")。而且對象數(shù)據(jù)與非變量數(shù)據(jù)相比有一個特點,即它是有內(nèi)部結(jié)構(gòu)的,即屬性。
1、變量—>數(shù)據(jù)
2、變量—>數(shù)據(jù)(地址)—>數(shù)據(jù)(對象、函數(shù))
總結(jié)一下就是:變量是一個名字,它綁定一塊存儲空間,這個空間要么放數(shù)據(jù),要么放數(shù)據(jù)的地址(或者某種引用)
基礎(chǔ)數(shù)據(jù)類型(undefined、null、boolean、number、string)都是按值訪問的。按值訪問相當(dāng)于將變量中的數(shù)據(jù)進行一次拷貝,給新的變量,原變量改變后,按值訪問的不會變化!


引用數(shù)據(jù)類型(對象、函數(shù))是按引用訪問的!引用數(shù)據(jù)類型存儲在變量中的值是保存在堆內(nèi)存中的對象的地址。JS不允許直接訪問堆內(nèi)存中的對象?因此我們不能直接操作對象的堆內(nèi)存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。
簡單說就是:變量綁定的那塊內(nèi)存里放的數(shù)據(jù),并不是我真正想要的數(shù)據(jù),它是一個元數(shù)據(jù)、一個地址,一個指向我真正想用的數(shù)據(jù)的位置的指針。
當(dāng)我們要訪問堆內(nèi)存中的引用數(shù)據(jù)類型時,實際上我們首先是從變量中獲取了該對象的地址引用(指針),然后再從堆內(nèi)存中取得我們需要的數(shù)據(jù)!
下面這個例子,b 等于的是 a 對象的引用,而不是把整個 a 對象復(fù)制給 b, 因此b a 指向的是同一個對象,所以b改動了對象的值,a指向的對象的值也改變了!

另外一個例子
當(dāng)對象被當(dāng)參數(shù)傳遞時,傳的是該對象的地址引用?。榱俗C明對象是按值傳遞的!傳遞!傳遞!不是訪問!引用類型按引用訪問,按值傳遞! 基本數(shù)據(jù)類型則都是按值傳遞和按值訪問?。?/p>
