ECMAScript 原始值和引用值 - JavaScript ING

來源:互聯網
上載者:User
本篇文章主要和大家分享了一些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 的值(地址引用)不一樣。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.