JavaScript值型別和引用型別
JavaScript中對值型別和引用型別最為重要的知識點之一。
如果對它沒有良好的掌握,那麼JavaScript很多程式碼執行現象將無法解釋,當然也就無法順暢進行開發。
首先看一段程式碼例項:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let obj={ webName:"螞蟻部落", address:"青島市南區" } let newObj=obj; newObj.webName="antzone"; console.log(obj.webName);
程式碼執行效果截圖如下:
上述程式碼中,我們修改的是newObj物件的webName屬性值,為何obj物件的相應屬性值也發生了改變。
如果掌握了值型別和引用型別,那麼就很容易理解出現上述結果的原因。
下面就通過通俗易通的語言介紹一下值型別資料與引用型別資料的各自特徵。
一.值型別資料:
值型別資料通俗的講就是簡單的資料段,JavaScript存在六種基本型別:
(1).string
(2).number
(3).boolean
(4).symbol(ES2015)
(5).null
(6).undefined值型別資料儲存在棧記憶體中,值型別資料直接儲存在變數中。
程式碼如下:
[JavaScript] 純文字檢視 複製程式碼let webName="螞蟻部落";
字串是一個值型別資料,在記憶體中的儲存圖示如下:
值型別資料直接儲存在變數中。
下面我們再來進行如下操作,程式碼如下:
[JavaScript] 純文字檢視 複製程式碼let webName="螞蟻部落"; let str=webName;
程式碼將變數webName賦值給變數str,圖示如下:
值型別資料賦值,是將實際值複製一份給對應的變數。
上面的程式碼中,會將變數webName的值"螞蟻部落"複製一份,然後賦值給變數str。
兩個值型別資料是完全獨立的,操作其中的一個資料不會影響到另一個。
二.引用型別資料:
引用型別資料通常是由多個值構成,比如一個物件多個方法或者多個屬性。
引用型別資料與值型別資料在記憶體中的儲存方式有很大區別。
值型別資料儲存在棧記憶體中,而引用型別資料在棧記憶體中儲存的是一個地址。
此地址指向堆記憶體中資料的實際儲存的記憶體地址。
程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼let obj={ webName:"螞蟻部落", address:"青島市南區" }
在記憶體中的儲存圖示如下:
也就是說變數obj中儲存的不是資料本身,而是指向實際資料的記憶體地址。
繼續進行操作,程式碼如下:
[JavaScript] 純文字檢視 複製程式碼let obj={ webName:"螞蟻部落", address:"青島市南區" } let newObj=obj;
在記憶體中的儲存圖示如下:
newObj=obj其實是將實際資料的記憶體地址賦值給變數newObj。
也就是說這兩個變數指向同一個實際資料,那麼文章開頭舉得例子就非常好理解了。
因為是指向同一個物件,所以修改就等同於修改obj。
三.包裝物件:
前面說過,值型別資料是一個簡單的資料段,引用型別的資料是由多值構成,比如具有方法或者屬性。
但是為什麼如下程式碼可以正常執行呢:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let webName="螞蟻部落"; console.log(webName.length);
可以正常輸出字串的長度。
為什麼值型別資料也具有屬性呢,這是因為字串會臨時包裝成一個物件。
當程式碼執行完畢後,此物件就會釋放。
相關文章
- 值型別和引用型別型別
- JavaScript - 基本型別與引用型別值JavaScript型別
- javascript原始值和引用值型別及區別JavaScript型別
- JavaScript引用型別-Object型別JavaScript型別Object
- c#:值型別&引用型別C#型別
- javascript:引用型別JavaScript型別
- 區別值型別資料和引用型別資料型別
- 值型別與引用型別的區別型別
- 33 個 JavaScript 核心概念系列(二): 值型別與引用型別JavaScript型別
- 從賦值看基本型別和引用型別的區別賦值型別
- C#程式設計引用型別和值型別 以及引用傳遞和值傳遞C#程式設計型別
- 《JavaScript物件導向精要》之一:基本型別和引用型別JavaScript物件型別
- js基本型別和引用型別區別JS型別
- Java的基本型別和引用型別Java型別
- JS篇-基本型別和引用型別、typeofJS型別
- Golang的值型別和引用型別的範圍、儲存區域、區別Golang型別
- C#引用型別和值型別在堆、棧中的儲存C#型別
- c#中值型別和引用型別的區別C#型別
- 你不知道的JavaScript--Item4 基本型別和基本包裝型別(引用型別)JavaScript型別
- JavaSE 形參和返回值(引用型別)Java型別
- C#學習筆記之值型別與引用型別C#筆記型別
- JavaScript - 變數、值、型別JavaScript變數型別
- ECMAScript 原始型別與引用型別型別
- JavaScript中的Object的引用型別JavaScriptObject型別
- golang中 值型別,指標,引用的區別Golang型別指標
- JS開發者應懂的33個概念系列2&&3--原始型別 && 值型別和引用型別JS型別
- js資料型別之基本資料型別和引用資料型別JS資料型別
- JAVA中基本資料型別和引用資料型別Java資料型別
- 問題分享:Js引用型別賦值JS型別賦值
- js引用型別JS型別
- javascript值型別是什麼JavaScript型別
- Swift-Optional Binding引發的值型別與引用型別的思考Swift型別
- JavaScript 字串轉換數值型別JavaScript字串型別
- JavaScript 基礎 (二) - 引用資料型別 (物件)JavaScript資料型別物件
- Go 的引用型別Go型別
- Golang 引用型別-mapGolang型別
- 引用型別之Object型別Object
- JavaScript筆記5:計時器、物件、基本資料型別、引用資料型別JavaScript筆記物件資料型別