JS基本類型和引用類型的區別

按照CEMA-262第3版的定義,JS變量鬆散類型的本質,決定了它只是在特定時間用於保存特定值的一個名字而已。由於不存在必須定義變量數據類型的規則,變量的值及其數據類型可以在腳本生命週期內改變。儘管從某種角度看,這可能是一個既有趣又強大,同時又容易出問題的特性,但js變量實際的複雜程度還遠不止如此。

 

ECMAScript變量可能包含兩種不同數據類型的值:基本類型值和引用類型值。

基本類型值指的是那些保存在棧內存中的簡單數據段,即這種值完全保存在內存中的一個位置。

引用類型值則是指那些保存在堆內存中的對象,意思是變量中保存的實際上只是一個指針,這個指針指向內存中的另一個位置,該位置保存對象。

 

在將一個值賦給變量時,解析器必須確定這個值是基本類型值,還是引用類型值。(Undefined、Null、Boolean、Number、String)這五種基本數據類型的值在內存中分別佔有固定大小的空間,因此可以把他們的值保存在棧內存中。對於保存基本數據類型的變量,我們可以說他們是按值訪問的,因爲我們操作的是它們實際保存的值。

 

如果賦給變量的是一個引用類型的值,則必須在堆內存中去爲這個值分配空間。由於這種值的大小不固定,因此不能把它們保存到棧內存中。但內存地址的大小是固定的,因此可以將內存地址保存在棧內存中。這樣,當查詢引用類型的變量時,就可以首先從棧中讀取內存地址,然後在“順藤摸瓜”找到保存在堆中的值。對於這種查詢方式,我們把它叫做按引用訪問,因爲我們操作的不是實際的值,而是被那個值所引用的對象

發佈了61 篇原創文章 · 獲贊 8 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章