本篇文章主要和大家分享了一些ECMAScript 原始值和引用值的知識,有需要的朋友們可以參考一下
一、原始值和引用值的概念
在 ECMAScript 中,變數可以存在兩種類型的值,即
原始值和
引用值。
1.1 原始值
(1)原始值指的是 原始類型 的值,也叫 基本類型,例如 Number、Stirng、Boolean、Null、Underfined 。
(2)儲存在棧(stack)中的簡單資料區段,也就是說,它們的值直接儲存在變數訪問的位置。
(3)注意
在許多語言中,字串都被看作參考型別,而非原始類型,因為字串的長度是可變的。ECMAScript 打破了這一傳統。
1.2 引用值
(1)引用值指的是 參考型別 的值,例如 Object、Function、Array、Date、RegExp 。
(2)儲存在堆(heap)中的對象,也就是說,儲存在變數處的值是一個指標(point),指向儲存對象的記憶體處。
二、棧和堆
2.1 原始值儲存在棧中
為變數賦值時,ECMAScript 的解釋程式必須判斷該值是原始類型,還是參考型別。要實現這一點,解釋程式則需嘗試判斷該值是否為 ECMAScript 的原始類型之一,即 Undefined、Null、Boolean、Number 和 String 型。由於這些原始類型佔據的空間是固定的,所以可將他們儲存在較小的記憶體地區 - 棧中。這樣儲存便於迅速查尋變數的值。
2.2 引用值儲存在堆中
如果一個值是參考型別的,那麼它的儲存空間將從堆中分配。由於引用值的大小會改變,所以不能把它放在棧中,否則會降低變數查尋的速度。相反,放在變數的棧空間中的值是該Object Storage Service在堆中的地址。地址的大小是固定的,所以把它儲存在棧中對變數效能無任何負面影響。
2.3 圖示
三、原始值和引用值的不同
3.1 賦值方式
3.2 值是否可變
3.3 比較方式不同
四、賦值方式和值是否可變
4.1 原始值是以值的拷貝方式賦值,值是不可變的。
4.2 引用值是以引用的拷貝方式賦值,值是可變的。
4.3 Example
4.4 說明
(1)原始值賦值 → 其實是將值拷貝一份並賦值給新的變數,這個值就是副本,他和原始值是互相獨立的,改變其中一個值不會影響到其他的值。
(2)引用值賦值 → 當一個參考型別,例如一個對象,使用 = 將其賦值給另一個變數,實際上是其對象的地址引用賦值給新的變數,這兩個變數都指向同一個地址引用,他們有相同的地址。所以若改變其中一個變數(的地址引用指向的對象),另一個變數(的地址引用指向的同一個對象)也將改變。
4.5 擴充
五、比較方式不同
5.1 原始值的比較是 值 的比較
5.2 引用值的比較是 引用 的比較
5.3 Example
5.4 說明
(1)原始值 a 和 b 的資料類型不同,但也可以進行值的比較。(在值比較之前,自動進行了資料類型的 隱式轉換)
== → 只比較值
=== → 不僅比較值,還比較資料類型
(2)引用值 obj1 和 obj2 分別引用的是存放在堆記憶體中的兩個不同的對象,所以 obj1 和 obj2 的值(地址引用)不一樣。
閱讀更多
一、原始值和引用值的概念
在 ECMAScript 中,變數可以存在兩種類型的值,即
原始值和
引用值。
1.1 原始值
(1)原始值指的是 原始類型 的值,也叫 基本類型,例如 Number、Stirng、Boolean、Null、Underfined 。
(2)儲存在棧(stack)中的簡單資料區段,也就是說,它們的值直接儲存在變數訪問的位置。
(3)注意
在許多語言中,字串都被看作參考型別,而非原始類型,因為字串的長度是可變的。ECMAScript 打破了這一傳統。
1.2 引用值
(1)引用值指的是 參考型別 的值,例如 Object、Function、Array、Date、RegExp 。
(2)儲存在堆(heap)中的對象,也就是說,儲存在變數處的值是一個指標(point),指向儲存對象的記憶體處。
二、棧和堆
2.1 原始值儲存在棧中
為變數賦值時,ECMAScript 的解釋程式必須判斷該值是原始類型,還是參考型別。要實現這一點,解釋程式則需嘗試判斷該值是否為 ECMAScript 的原始類型之一,即 Undefined、Null、Boolean、Number 和 String 型。由於這些原始類型佔據的空間是固定的,所以可將他們儲存在較小的記憶體地區 - 棧中。這樣儲存便於迅速查尋變數的值。
2.2 引用值儲存在堆中
如果一個值是參考型別的,那麼它的儲存空間將從堆中分配。由於引用值的大小會改變,所以不能把它放在棧中,否則會降低變數查尋的速度。相反,放在變數的棧空間中的值是該Object Storage Service在堆中的地址。地址的大小是固定的,所以把它儲存在棧中對變數效能無任何負面影響。
2.3 圖示
三、原始值和引用值的不同
3.1 賦值方式
3.2 值是否可變
3.3 比較方式不同
四、賦值方式和值是否可變
4.1 原始值是以值的拷貝方式賦值,值是不可變的。
4.2 引用值是以引用的拷貝方式賦值,值是可變的。
4.3 Example
4.4 說明
(1)原始值賦值 → 其實是將值拷貝一份並賦值給新的變數,這個值就是副本,他和原始值是互相獨立的,改變其中一個值不會影響到其他的值。
(2)引用值賦值 → 當一個參考型別,例如一個對象,使用 = 將其賦值給另一個變數,實際上是其對象的地址引用賦值給新的變數,這兩個變數都指向同一個地址引用,他們有相同的地址。所以若改變其中一個變數(的地址引用指向的對象),另一個變數(的地址引用指向的同一個對象)也將改變。
4.5 擴充
五、比較方式不同
5.1 原始值的比較是 值 的比較
5.2 引用值的比較是 引用 的比較
5.3 Example
5.4 說明
(1)原始值 a 和 b 的資料類型不同,但也可以進行值的比較。(在值比較之前,自動進行了資料類型的 隱式轉換)
== → 只比較值
=== → 不僅比較值,還比較資料類型
(2)引用值 obj1 和 obj2 分別引用的是存放在堆記憶體中的兩個不同的對象,所以 obj1 和 obj2 的值(地址引用)不一樣。