## 大連科技
自己整理的,不一定正確,思路也比較亂!歡迎指正!
先講清楚幾個概念!
變量:變量是一個名字。它綁定了一塊內存(堆內存)!
變量值:存儲在變量那塊內存中的數據!數據基本可以分為兩種,基本數據類型和引用數據類型。(函數也相當于一組變量和變量值(鍵值對),函數名就是一個變量。而變量值是那個函數的地址引用)
對象:不能被變量直接綁定,而是要通過引用來間接綁定的數據就是對象(函數也是對象,"萬物皆對象")。而且對象數據與非變量數據相比有一個特點,即它是有內部結構的,即屬性。
1、變量—>數據
2、變量—>數據(地址)—>數據(對象、函數)
總結一下就是:變量是一個名字,它綁定一塊存儲空間,這個空間要么放數據,要么放數據的地址(或者某種引用)
基礎數據類型(undefined、null、boolean、number、string)都是按值訪問的。按值訪問相當于將變量中的數據進行一次拷貝,給新的變量,原變量改變后,按值訪問的不會變化!
引用數據類型(對象、函數)是按引用訪問的!引用數據類型存儲在變量中的值是保存在堆內存中的對象的地址。JS不允許直接訪問堆內存中的對象?因此我們不能直接操作對象的堆內存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。
簡單說就是:變量綁定的那塊內存里放的數據,并不是我真正想要的數據,它是一個元數據、一個地址,一個指向我真正想用的數據的位置的指針。
當我們要訪問堆內存中的引用數據類型時,實際上我們首先是從變量中獲取了該對象的地址引用(指針),然后再從堆內存中取得我們需要的數據!
下面這個例子,b 等于的是 a 對象的引用,而不是把整個 a 對象復制給 b, 因此b a 指向的是同一個對象,所以b改動了對象的值,a指向的對象的值也改變了!
另外一個例子
當對象被當參數傳遞時,傳的是該對象的地址引用!(為了證明對象是按值傳遞的!傳遞!傳遞!不是訪問!引用類型按引用訪問,按值傳遞! 基本數據類型則都是按值傳遞和按值訪問!)